qt - 在 Qt 上更新程序后重新启动应用程序

标签 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. 不保证您的 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();
}

关于qt - 在 Qt 上更新程序后重新启动应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11042141/

相关文章:

c++ - Qt:按值将自定义对象存储在集合中

c - Qt Creator 中的 Gstreamer rtsp 服务器链接

python - QListWidget添加后可以刷新吗?

ruby - SystemExit 是一种特殊的异常吗?

java - 在后台运行一段时间后关闭应用程序

Apache 不加载所有虚拟主机

c# - 删除目录时 ASP.NET Web 应用程序重新启动

c++ - 将 TagLib 链接到 Qt 时出错

c# - 如何在 WPF 中使用 Application.Exit 事件?

cordova - 以编程方式重新启动我的Phonegap应用