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

问题描述:

我正在查找有关在调用Qt应用程序的quit()之后发生的事情的文档。这个问题源于我在处理quit()中处理打开QDialog的返回值时遇到的问题。我想澄清以下顺序:当Qt应用程序的quit()方法被调用时,QDialogs会发生什么?

  1. QCoreApplication ::退出()或QApplication的::退出()被调用
  2. QWidget的::的closeEvent()不要求QDialogs。似乎所有打开的对话框都通过调用其reject()方法自动关闭。这是最重要的部分,这种行为有保证吗?
  3. “事件循环阻塞”QDialog :: exec()方法返回必须由调用方仔细处理(访问已删除对象的成员...)。
  4. 的aboutToQuit信号发射
  5. 应用程序的调用析构函数

所以程序流程是: 只要一个模式对话框是打开此对话框的事件循环运行。当调用quit()时,QDialog :: exec()(模态对话框的事件循环)正在返回,这可能意味着运行了很多附加代码,甚至可能在同一个线程中执行信号/插槽。然后正常的事件循环不再被处理,只是aboutToQuit()和析构函数被调用。

此说明是否正确?有人可以给我一个Qt文档来解释quit()和QDialog的交互吗?当在由于quit()调用返回的QDialog的exec()之后调用QDialog的exec()时会发生什么?谁在关闭这个QDialog?

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

编辑:如果之前调用过quit()方法,那么调用QDialog的exec()会被拒绝。所以我猜Qt内部知道应用程序即将退出,所以所有进一步的QDialogs立即返回“拒绝”。

我不知道你的意思与“的closeEvent不会调用QDialogs”,因为这是它调用reject()QDialog::closeEvent() code

至于各种exec()quit()之间的相互作用:

  1. QDialog::exec()使用嵌套QEventLoopQDialog::exec() code
  2. QCoreApplication::quit()循环遍历所有嵌套的事件循环,告诉它们退出:QCoreApplication::exec() code
  3. 如果在同一线程的主事件循环之后启动嵌套事件循环,则在应用程序主线程的对话框中,它不会尝试“exec”,而是立即返回。看到这里的第一个回报:QEventLoop::exec() code
+0

哇,感谢您的信息和代码段的直接链接!这有很大帮助!用“closeEvent不叫”我的意思是我重新实现了虚拟void closeEvent(...)方法在我的Dialog类中,并没有被调用。阅读另一篇文章,我认为这个方法不是在调用quit()的情况下调用的,而是直接拒绝对话()。也许我在某个地方犯了一个错误。 – FrozenTarzan

对于我来说,在主程序关闭之前,所有打开的对话框都必须“被拒绝”似乎是合乎逻辑的。 (这应该是一个评论,但我还没有足够的代表> <)。