ここに問題があります:
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();
}