成功更新后,我使用以下逻辑重新启动应用程序:
QString appName = QApplication::instance()->applicationName();
QString appDir = QApplication::instance()->applicationFilePath();
QStringList arguments = QApplication::instance()->arguments();
QProcess::startDetached( appName, arguments, appDir );
//quit the current application
QApplication::instance()->exit();
它启动新的应用程序并退出这两个应用程序。从 Qt,我了解到即使退出调用进程,新进程也会存在。我在这里遗漏了什么吗?
最佳答案
问题如下:
不保证您的
appName
不为空,也不保证与可执行文件的名称相同。在任何情况下,startDetached()
都需要可执行文件的完整路径。您的
appDir
不是 -- 它是可执行文件的完整文件路径。startDetached()
的最后一个参数是工作目录。为此,您可以简单地使用QDir::currentPath()
。您调用的所有 QApplication 方法都是静态的。您不需要使用
instance()
。
要更新您的应用程序,您可以:
将当前运行的可执行文件重命名为其他名称。
以原来的名字编写新的可执行文件。
开始如下。
这在 Windows 和 Unices 上都适用,只要您的应用程序具有足够的管理权限——不过通常不会,因此您需要一个具有足够访问权限的单独更新程序。更新程序需要在用户方便时通知应用程序自行重启。在用户忙于使用它时强行重启应用程序可能不是很好。
下面是一个工作示例:
#include <QtWidgets>
void start() {
auto app = QCoreApplication::applicationFilePath();
auto arguments = QCoreApplication::arguments();
auto pwd = QDir::currentPath();
qDebug() << app << arguments << pwd;
QProcess::startDetached(app, arguments, pwd);
QCoreApplication::exit();
}
int main(int argc, char **argv) {
QApplication app{argc, argv};
QPushButton button{QStringLiteral("Spawn")};
Starter starter;
QObject::connect(&button, &QPushButton::clicked, &start);
button.show();
app.exec();
}
关于qt - 在 Qt 上更新程序后重新启动应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11042141/