成功更新后,我使用以下逻辑重新启动应用程序:
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开始,我知道即使退出调用进程,新进程也会存在。我在这里错过了什么吗?
答案 0 :(得分:4)
以下是问题:
不保证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();
}