我正在寻找一份关于调用Qt应用程序的quit()之后/之后发生的事情的文档。这个问题源于我在处理quit()上打开的QDialog的返回值时遇到的一个问题。我想澄清以下顺序:
- QCoreApplication::quit()或QApplication::qui()被调用
- 没有为QDialogs调用QWidget::closeEvent()。似乎所有打开的对话框都会通过调用它们的reject()方法自动关闭。这是最重要的部分,这种行为有保证吗
- "事件循环阻塞"QDialog::exec()方法返回,调用方必须小心处理(访问已删除对象的成员,…)
- 将发出aboutToQuit信号
- 应用程序的析构函数被调用
因此程序流程为:只要模式对话框处于打开状态,该对话框的事件循环就会运行。当quit()被调用时,QDialog::exec()(模态对话框的事件循环)正在返回,这可能意味着运行了许多额外的代码,甚至当信号/插槽在同一线程中时,它们也可以被执行。然后不再处理正常的事件循环,只调用aboutToQuit()和析构函数。
这个描述正确吗?有人能给我指一个Qt文档,解释quit()和QDialog的交互吗?在由于quit()调用而返回QDialog的exec()之后,当我调用QDialog时会发生什么?那么谁将关闭这个QDialog?
谢谢,我对这些互动有点困惑。
编辑:如果之前调用了quit()方法,那么对QDialog的exec()的调用似乎会被拒绝。所以我想Qt内部知道应用程序即将退出,所以所有进一步的QDialog都会立即返回"被拒绝"。
我不知道你说的"closeEvent不是为QDialogs调用的"是什么意思,因为这就是它调用reject()
:QDialog::closeEvent()代码的地方
关于各种exec()
和quit()
之间的相互作用:
QDialog::exec()
使用嵌套的QEventLoop
:QDialog::exec()代码QCoreApplication::quit()
循环通过告诉它们退出:QCoreApplication::exec()代码上的所有嵌套事件循环- 如果嵌套事件循环是在同一线程的主事件循环之后启动的,那么在作为应用程序主线程的对话框的情况下,它不会尝试"exec",而是立即返回。请参阅此处的第一个返回:QEventLoop::exec()代码
在主程序关闭之前,所有打开的对话框都必须被"拒绝",这对我来说似乎是合乎逻辑的。(这应该是一条评论,但我还没有足够的代表>。<)。