当Qt应用程序的quit()方法被调用时,QDialogs会发生什么?
问题描述:
我正在查找有关在调用Qt应用程序的quit()之后发生的事情的文档。这个问题源于我在处理quit()中处理打开QDialog的返回值时遇到的问题。我想澄清以下顺序:当Qt应用程序的quit()方法被调用时,QDialogs会发生什么?
- QCoreApplication ::退出()或QApplication的::退出()被调用
- QWidget的::的closeEvent()不要求QDialogs。似乎所有打开的对话框都通过调用其reject()方法自动关闭。这是最重要的部分,这种行为有保证吗?
- “事件循环阻塞”QDialog :: exec()方法返回必须由调用方仔细处理(访问已删除对象的成员...)。
- 的aboutToQuit信号发射
- 应用程序的调用析构函数
所以程序流程是: 只要一个模式对话框是打开此对话框的事件循环运行。当调用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()
之间的相互作用:
-
QDialog::exec()
使用嵌套QEventLoop
:QDialog::exec() code -
QCoreApplication::quit()
循环遍历所有嵌套的事件循环,告诉它们退出:QCoreApplication::exec() code - 如果在同一线程的主事件循环之后启动嵌套事件循环,则在应用程序主线程的对话框中,它不会尝试“exec”,而是立即返回。看到这里的第一个回报:QEventLoop::exec() code
答
对于我来说,在主程序关闭之前,所有打开的对话框都必须“被拒绝”似乎是合乎逻辑的。 (这应该是一个评论,但我还没有足够的代表> <)。
哇,感谢您的信息和代码段的直接链接!这有很大帮助!用“closeEvent不叫”我的意思是我重新实现了虚拟void closeEvent(...)方法在我的Dialog类中,并没有被调用。阅读另一篇文章,我认为这个方法不是在调用quit()的情况下调用的,而是直接拒绝对话()。也许我在某个地方犯了一个错误。 – FrozenTarzan