根据这篇文章here,当我们关闭Qt程序时,可以这么说。一旦mainWindow的close事件开始,除了GUI线程中的close事件处理程序和类解构函数之外什么都不会执行?
例如,如果QTimer
在GUI线程中将timeout()
信号触发到同一线程中的slot
。当mainWindow的关闭事件开始时,插槽将不会再次被执行?
答案 0 :(得分:1)
自动处理:
进出物体的所有信号都会自动断开,并且 从该事件中删除该对象的任何待处理发布事件 队列。但是,使用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()
返回后计时器将以某种方式被全局杀死也是错误的。它们仍然在运行,只要你重新启动事件循环,它们就会很高兴为你开火。毕竟,第二个消息框将显示非零计数。
您的问题应该重写您正在尝试解决的问题。你要求提供非常具体的细节,这些细节本身就没有意义。请告诉使用你为何提出这样的问题。