146

Qtプログラムを終了するにはどうすればよいですか?たとえば、データファイルを読み込んでファイルの破損を発見した場合、ユーザーはこのアプリを終了するか、データファイルを再開する必要がありますか?

するべきか:

  1. 電話exit(EXIT_FAILURE)
  2. 電話QApplication::quit()
  3. 電話QCoreApplication::quit()

そして(2)と(3)の違いは?

4

6 に答える 6

167

QApplication は QCoreApplication から派生しているためquit()、 のパブリック スロットであるを継承するため、 と の間にQCoreApplication違いはありません。QApplication::quit()QCoreApplication::quit()

そのドキュメントで読むことができるように、QCoreApplication::quit()リターンコード0(成功)で終了するようにアプリケーションに指示します」。. ファイルの破損を発見したために終了したい場合は、成功を意味するリターン コード 0 で終了したくない場合がQCoreApplication::exit()あります。慣例により、エラーを示すゼロ以外の returnCode を指定できるため、呼び出す必要があります。

「イベント ループが実行されていない場合、この関数 (QCoreApplication::exit()) は何も実行しない」ことに注意することが重要です。その場合は、 を呼び出す必要がありますexit(EXIT_FAILURE)

于 2011-11-06T10:06:14.373 に答える
33

を呼び出すことができますqApp->exit();。私はいつもそれを使用していますが、それで問題が発生したことはありません。

アプリケーションがコマンド ライン アプリケーションの場合、終了コードを返したいと思うかもしれません。コードが何であるかは完全にあなた次第です。

于 2011-11-06T10:00:30.877 に答える
1

このまさに質問を検索しているときに、ドキュメントでこの例を発見しました。

QPushButton *quitButton = new QPushButton("Quit");
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection);

もちろん、あなたの特定の行動については必要な変更を加えてください。

このメモと一緒に。

QueuedConnection を使用して、常にシグナルをこのスロットに接続することをお勧めします。コントロールがメイン イベント ループに入る前 (「int main」が exec() を呼び出す前など) に、このスロットに接続された (キューに入れられていない) シグナルが発行された場合、スロットは効果がなく、アプリケーションは終了しません。キュー接続を使用すると、制御がメイン イベント ループに入るまでスロットが呼び出されないことが保証されます。

QGuiApplication::lastWindowClosed() シグナルを quit() に接続するのが一般的です

于 2020-12-01T22:41:31.440 に答える