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



我正在寻找一份关于调用Qt应用程序的quit()之后/之后发生的事情的文档。这个问题源于我在处理quit()上打开的QDialog的返回值时遇到的一个问题。我想澄清以下顺序:

  1. QCoreApplication::quit()或QApplication::qui()被调用
  2. 没有为QDialogs调用QWidget::closeEvent()。似乎所有打开的对话框都会通过调用它们的reject()方法自动关闭。这是最重要的部分,这种行为有保证吗
  3. "事件循环阻塞"QDialog::exec()方法返回,调用方必须小心处理(访问已删除对象的成员,…)
  4. 将发出aboutToQuit信号
  5. 应用程序的析构函数被调用

因此程序流程为:只要模式对话框处于打开状态,该对话框的事件循环就会运行。当quit()被调用时,QDialog::exec()(模态对话框的事件循环)正在返回,这可能意味着运行了许多额外的代码,甚至当信号/插槽在同一线程中时,它们也可以被执行。然后不再处理正常的事件循环,只调用aboutToQuit()和析构函数。

这个描述正确吗?有人能给我指一个Qt文档,解释quit()和QDialog的交互吗?在由于quit()调用而返回QDialog的exec()之后,当我调用QDialog时会发生什么?那么谁将关闭这个QDialog?

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

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

我不知道你说的"closeEvent不是为QDialogs调用的"是什么意思,因为这就是它调用reject():QDialog::closeEvent()代码的地方

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

  1. QDialog::exec()使用嵌套的QEventLoop:QDialog::exec()代码
  2. QCoreApplication::quit()循环通过告诉它们退出:QCoreApplication::exec()代码上的所有嵌套事件循环
  3. 如果嵌套事件循环是在同一线程的主事件循环之后启动的,那么在作为应用程序主线程的对话框的情况下,它不会尝试"exec",而是立即返回。请参阅此处的第一个返回:QEventLoop::exec()代码

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

相关内容

最新更新