在Qt上的Updater之后重新启动应用程序

时间:2012-06-14 22:19:39

标签: qt exit restart

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

   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开始,我知道即使退出调用进程,新进程也会存在。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:4)

以下是问题:

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

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

  3. startDetached()的最后一个参数是工作目录。您只需使用QDir::currentPath()即可。

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

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

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

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

    3. 从下面开始。

    4. 这适用于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();
      }