Qtプログラムを終了するにはどうすればよいですか?たとえば、データファイルを読み込んでファイルの破損を発見した場合、ユーザーはこのアプリを終了するか、データファイルを再開する必要がありますか?
するべきか:
- 電話
exit(EXIT_FAILURE)
- 電話
QApplication::quit()
- 電話
QCoreApplication::quit()
そして(2)と(3)の違いは?
QApplication は QCoreApplication から派生しているためquit()
、 のパブリック スロットであるを継承するため、 と の間にQCoreApplication
違いはありません。QApplication::quit()
QCoreApplication::quit()
そのドキュメントで読むことができるように、QCoreApplication::quit()
「リターンコード0(成功)で終了するようにアプリケーションに指示します」。. ファイルの破損を発見したために終了したい場合は、成功を意味するリターン コード 0 で終了したくない場合がQCoreApplication::exit()
あります。慣例により、エラーを示すゼロ以外の returnCode を指定できるため、呼び出す必要があります。
「イベント ループが実行されていない場合、この関数 (QCoreApplication::exit()) は何も実行しない」ことに注意することが重要です。その場合は、 を呼び出す必要がありますexit(EXIT_FAILURE)
。
を呼び出すことができますqApp->exit();
。私はいつもそれを使用していますが、それで問題が発生したことはありません。
アプリケーションがコマンド ライン アプリケーションの場合、終了コードを返したいと思うかもしれません。コードが何であるかは完全にあなた次第です。
このまさに質問を検索しているときに、ドキュメントでこの例を発見しました。
QPushButton *quitButton = new QPushButton("Quit");
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection);
もちろん、あなたの特定の行動については必要な変更を加えてください。
このメモと一緒に。
QueuedConnection を使用して、常にシグナルをこのスロットに接続することをお勧めします。コントロールがメイン イベント ループに入る前 (「int main」が exec() を呼び出す前など) に、このスロットに接続された (キューに入れられていない) シグナルが発行された場合、スロットは効果がなく、アプリケーションは終了しません。キュー接続を使用すると、制御がメイン イベント ループに入るまでスロットが呼び出されないことが保証されます。
QGuiApplication::lastWindowClosed() シグナルを quit() に接続するのが一般的です