【问题标题】:What happens with QDialogs when a Qt application's quit() method is called?当调用 Qt 应用程序的 quit() 方法时,QDialogs 会发生什么?
【发布时间】:2017-01-03 09:40:57
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: qt qdialog


    【解决方案1】:

    我不确定您所说的“QDialogs 不调用 closeEvent”是什么意思,因为它调用了 reject():QDialog::closeEvent() code

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

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

    【讨论】:

    • 哇,感谢您提供的信息和代码片段的直接链接!这很有帮助! “closeEvent is not called”是指我在我的 Dialog 类中重新实现了 virtual void closeEvent(...) 方法并且它没有被调用。阅读另一篇文章,我认为在退出()调用的情况下不会调用此方法,而是直接拒绝()对话框。也许我在某个地方犯了错误。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 2023-03-07
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多