Qt:关闭期间的事件循环

时间:2015-02-27 10:52:44

标签: c++ qt

根据这篇文章here,当我们关闭Qt程序时,可以这么说。一旦mainWindow的close事件开始,除了GUI线程中的close事件处理程序和类解构函数之外什么都不会执行?

例如,如果QTimer在GUI线程中将timeout()信号触发到同一线程中的slot。当mainWindow的关闭事件开始时,插槽将不会再次被执行?

2 个答案:

答案 0 :(得分:1)

自动处理:

  

QObject::~QObject()

     

进出物体的所有信号都会自动断开,并且   从该事件中删除该对象的任何待处理发布事件   队列。但是,使用deleteLater()而不是使用它通常更安全   直接删除QObject子类。

但是对于多线程应用,您需要使用deleteLater()来避免崩溃:

  

警告:等待挂起事件时删除QObject   交付可能导致崩溃。您不能直接删除QObject   如果它存在于与当前正在执行的线程不同的线程中。   请改用deleteLater(),这将导致事件循环被删除   所有待处理事件发送给它后的对象。

答案 1 :(得分:1)

不,表示一旦mainWindow的close事件开始,除了close事件处理程序和类析构函数之外,GUI线程中不会执行任何其他操作。

假设我们有以下代码(在C ++ 11中):

#include <QApplication>
#include <QLabel>
#include <QMessageBox>
#include <QTimer>

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   QLabel label1("Hello, World!");
   label1.show();
   label1.setMinimumSize(200, 100);
   app.exec();

   QTimer timer;
   int counter = 0;
   QObject::connect(&timer, &QTimer::timeout, [&counter]{ counter ++; });
   timer.start(100);
   QMessageBox::information(nullptr, "Done",
                            QString("We're Done with \"%1\"").arg(label1.text()));
   QMessageBox::information(nullptr, "Really Done",
                            QString("Timer has ticked %1 times").arg(counter));
   return 0;
}

显然,在exec()返回后,非析构函数代码执行 - 这里我们显示一个消息框。在QLabel返回后,主窗口(在本例中为exec())仍然存在。

假设在exec()返回后计时器将以某种方式被全局杀死也是错误的。它们仍然在运行,只要你重新启动事件循环,它们就会很高兴为你开火。毕竟,第二个消息框将显示非零计数。

您的问题应该重写您正在尝试解决的问题。你要求提供非常具体的细节,这些细节本身就没有意义。请告诉使用你为何提出这样的问题。