当调用 Qt 应用程序的 quit() 方法时,QDialogs 会发生什么?

What happens with QDialogs when a Qt application's quit() method is called?

我正在寻找有关调用 Qt 应用程序的 quit() 时发生的事情 after/while 的文档。这个问题源于我在处理 quit() 上打开的 QDialogs 的 return 值时遇到的问题。我想澄清以下顺序:

  1. QCoreApplication::quit() 或 QApplication::quit() 被调用
  2. QDialogs 不调用 QWidget::closeEvent()。似乎所有打开的对话框都通过调用它们的 reject() 方法自动关闭。这是最重要的部分,这种行为是否得到保证?
  3. "event-loop-blocking" QDialog::exec() 方法 return 调用者必须小心处理(访问已删除对象的成员,...)。
  4. 发出 aboutToQuit 信号
  5. 应用程序的析构函数被调用

所以程序流程是: 只要模式对话框打开,此对话框的事件循环就是 运行ning。当调用 quit() 时 QDialog::exec() (模式对话框的事件循环)是 returning 这可能意味着很多额外的代码是 运行 甚至 signal/slots 可以在它们处于同一线程时执行。然后不再处理正常的事件循环,只是aboutToQuit()和析构函数被调用。

这个描述是否正确?有人可以指点我解释 quit() 和 QDialog 交互的 Qt 文档吗?由于 quit() 调用,当我在 QDialog returned 的 exec() 之后调用 QDialog 的 exec() 时会发生什么?谁在关闭这个 QDialog?

谢谢,我对所有这些互动有点困惑。

编辑: 如果之前调用了 quit() 方法,似乎会拒绝对 QDialog 的 exec() 的调用。所以我猜 Qt 内部知道应用程序即将退出,所以所有进一步的 QDialogs return "rejected" 立即。

在我看来,所有打开的对话框都必须 "rejected" 才能关闭主程序,这似乎合乎逻辑。 (这应该是评论,但我还没有足够的代表 >.< )。

我不确定你说的 "closeEvent is not called for QDialogs" 是什么意思,因为那是它调用 reject() 的地方:QDialog::closeEvent() code

至于各种exec()quit()之间的交互:

  1. QDialog::exec() 使用嵌套 QEventLoopQDialog::exec() code
  2. QCoreApplication::quit() 遍历所有嵌套事件循环告诉他们退出:QCoreApplication::exec() code
  3. 如果嵌套事件循环在同一个线程的主事件循环之后启动,在对话框将成为应用程序主线程的情况下,它不会尝试 "exec",而是 return 立即地。在此处查看第一个 return:QEventLoop::exec() code