2017-01-03 19 views
0

私は、Qtアプリケーションのquit()を呼び出した後、またはその間に起こることに関するドキュメントを探しています。問題は、quit()で開いているQDialogの戻り値を処理していた問題が原因です。私は、次の手順を明確にしたいと思います:Qtアプリケーションのquit()メソッドが呼び出されたとき、QDialogsはどうなりますか?

  1. QCoreApplication ::終了()またははQApplication ::終了は、()
  2. のQWidget :: closeEvent()がQDialogsのために呼び出されていないと呼ばれています。開いているすべてのダイアログは、reject()メソッドを呼び出すことによって自動的に閉じられているようです。これは最も重要な部分ですが、この動作は保証されていますか?
  3. "イベントループブロッキング" QDialog :: exec()メソッドは、呼び出し側が注意深く処理しなければならないもの(既に削除されたオブジェクトのメンバーへのアクセスなど)を返します。 aboutToQuit信号が
  4. を放出され
  5. アプリケーションのデストラクタが

と呼ばれているので、プログラムの流れは次のとおりです。 限りモーダルダイアログは、このダイアログのイベントループが実行されている開いています。 quit()を呼び出すと、QDialog :: exec()(モーダルダイアログのイベントループ)が返されます。これは、多くの追加コードが実行され、シグナル/スロットが同じスレッドにある場合でも実行できることを意味する可能性があります。その後、通常のイベントループはもう処理されず、aboutToQuit()だけでデストラクタが呼び出されます。

この説明は正しいですか?誰かがquit()とQDialogのやりとりを説明するQtのドキュメントを私に指摘できますか? quit()コールのためにQDialogのexec()が返された後、QDialogのexec()を呼び出すとどうなりますか?誰がこのQDialogを終了しますか?

ありがとう、私は少しこれらの相互作用すべてについて混乱しています。

編集: quit()メソッドが以前に呼び出された場合、QDialogのexec()の呼び出しは拒否されるようです。だから私はQtが内部的にアプリケーションが終了しようとしていることを知っているので、それ以降のQDialogsは直ちに「拒否」を返します。

答えて

1

は、私はそれが呼び出した場所なので、あなたが「closeEventがQDialogsのために呼び出されていない」と何を意味するかわからないreject()

  1. QDialog::exec():様々なexec()quit()の間の相互作用についてはQDialog::closeEvent() code

    QEventLoopQDialog::exec() code

  2. すべてのネストされたイベントループのループで終了するように指示します。QCoreApplication::exec() code
  3. 同じスレッドのメインイベントループの後にネストされたイベントループが開始された場合、アプリケーションのメインスレッドとなるダイアログの場合、「exec」は試行されずすぐに戻ります。ここの最初の返品をご覧ください:QEventLoop::exec() code
+0

ワウ、情報とコードへの直接リンクをありがとう!それはたくさんの助けになります!"closeEventが呼び出されていない"とは、Dialogクラスのvirtual void closeEvent(...)メソッドを再実装したもので、呼び出されていないということです。別の投稿を読んで、私はこのメソッドがquit()コールの場合には呼び出されず、ダイアログは直接rejected()されていると考えました。たぶん私はどこかでミスをしました。 – FrozenTarzan

0

メインプログラムが終了する前に、開いているダイアログをすべて「拒否」する必要があります。 (これはコメントでなければなりませんが、私はまだ十分な担当者がいません>。<)。

関連する問題