示例:
Test::Test(QWidget *parent)
{
qDebug() <<"Test()";
}
Test::~Test()
{
qDebug() <<"~Test()";
}
void MainWindow::slot_test()
{
Test *p = new Test;
// out Test() message here ok
p->deleteLater();
QCoreApplication::sendPostedEvents(0, 0);
QCoreApplication::processEvents(QEventLoop::AllEvents);
// no ~Test() message out here
....
}
我知道deleteLater的实现是调用
QCoreApplication :: postEvent(this,new QDeferredDeleteEvent());
但是,为什么在QCoreApplication :: sendPostedEvents(0,0)之后运行或在QCoreApplication :: processEvents(QEventLoop :: AllEvents)之后运行却没有“〜Test()”消息出来?
上面的拖车代码应该调度事件队列中的所有事件,包括QEvent :: DeferredDelete?
离开函数slot_test()时,会出现“〜Test()”消息。
我认为我不明白qt文档中“当控件返回事件循环时该对象将被删除”的真实含义。
有人可以更清楚地解释吗?
答案 0 :(得分:0)
摘自QCoreApplication::processEvents
...的文档
如果您正在运行一个调用此的本地循环 连续运行,没有事件循环, DeferredDelete 事件将不会得到处理 [我的重点]。
如果您更改...
QCoreApplication::sendPostedEvents(0, 0);
QCoreApplication::processEvents(QEventLoop::AllEvents);
到...
QCoreApplication::instance()->exec();
那您应该得到预期的行为。
(注意:,我知道通过调用MainWindow::slot_test
来阻止您的QCoreApplication::exec
并不是一个长期的解决方案,但是...我猜是它的名字-slot_test
-这是Qt
slot
,无论如何将在主事件循环的上下文中调用,在这种情况下,slot_test
将返回该事件循环并在那里处理DeferredDelete事件。)