以下是问题:
您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();
}