3

成功更新后,我使用以下逻辑重新启动应用程序:

   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 中,我了解到即使退出调用进程后新进程也会继续存在。我在这里错过了什么吗?

4

1 回答 1

4

以下是问题:

  1. appName不保证不为空,也不保证与可执行文件的名称相同。在任何情况下,startDetached()都需要可执行文件的完整路径。

  2. appDir不是 - 它是可执行文件的完整文件路径。

  3. 最后一个参数startDetached()是工作目录。你可以简单地使用QDir::currentPath()它。

  4. 您调用的所有 QApplication 方法都是静态的。您不需要使用instance().

要更新您的应用程序,您可以:

  1. 将当前运行的可执行文件重命名为其他名称。

  2. 以原始名称写入新的可执行文件。

  3. 开始如下。

只要您的应用程序具有足够的管理权限,这在 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();
}
于 2012-06-15T01:38:37.740 回答