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

时间:2017-01-03 09:40:57

标签: qt qdialog

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

  1. 调用QCoreApplication :: quit()或QApplication :: quit()
  2. 没有为QDialogs调用QWidget :: closeEvent()。看来所有打开的对话框都会通过调用reject()方法自动关闭。这是最重要的部分,保证这种行为吗?
  3. "事件循环阻止" QDialog :: exec()方法返回必须由调用者小心处理(访问已删除对象的成员,...)。
  4. 发出aboutToQuit信号
  5. 应用程序的析构函数称为
  6. 所以程序流程是: 只要打开模式对话框,就会运行此对话框的事件循环。当quit()被调用时,QDialog :: exec()(模式对话框的事件循环)返回,这可能意味着运行了许多额外的代码,甚至当信号/插槽位于同一个线程时也可以执行。然后不再处理正常的事件循环,只需要调用ToTuit()和析构函数。

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

    谢谢,我对所有这些互动感到有些困惑。

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

2 个答案:

答案 0 :(得分:1)

我不确定你的意思"没有为QDialogs调用closeEvent"因为这就是它调用reject()QDialog::closeEvent() code

的地方

至于各种exec()quit()之间的互动:

  1. QDialog::exec()使用嵌套的QEventLoopQDialog::exec() code
  2. QCoreApplication::quit()遍历所有嵌套的事件循环,告诉他们退出:QCoreApplication::exec() code
  3. 如果在同一线程的主事件循环之后启动嵌套事件循环,则在对话框的情况下将是应用程序的主线程,它将不会尝试" exec"但马上回来。请在此处查看第一个回复:QEventLoop::exec() code

答案 1 :(得分:0)

对我而言,所有开放式对话都必须被拒绝"这似乎是合乎逻辑的。在主程序可以关闭之前。 (这应该是一个评论,但我还没有足够的代表>。<)。