Qt:关闭期间的事件循环

Qt: event loop during closing

本文关键字:事件 循环 Qt      更新时间:2023-10-16

根据本文,当我们关闭一个Qt程序时,可以这么说吗。一旦mainWindow的关闭事件启动,除了GUI线程中的关闭事件处理程序和类解构器之外,什么都不会执行?

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

不,表面上说,一旦mainWindow的关闭事件启动,除了关闭事件处理程序和类析构函数之外,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()返回后计时器将以某种方式被全局终止也是不正确的。它们仍在运行,只要你重新启动事件循环,它们就会很乐意为你开火。毕竟,第二个消息框将显示一个非零计数。

你的问题应该用你试图解决的问题来改写。你要求的是非常具体的细节,这些细节本身没有什么意义。请告诉用户为什么要问这样的问题。

自动处理:

QObject::~QObject()

所有进出对象的信号都会自动断开,并且该对象的任何挂起的已发布事件都将从事件中删除队列但是,通常使用deleteLater()比直接删除QObject子类。

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

警告:正在等待挂起事件时删除QObject交付可能会导致崩溃。不能直接删除QObject如果它存在于与当前执行的线程不同的线程中。改为使用deleteLater(),这将导致事件循环删除在所有未决事件都已传递到对象之后的对象。