示例:
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(这个,新的QDeferredDeleteEvent());
但是为什么在QCoreApplication::sendPostedEvents(0,0)之后运行或在QCoreApplication::processEvents(QEventLoop::AllEvents)之后运行时没有"~Test()“消息?
上面的两个代码应该调度事件队列中的所有事件,包括QEvent::DeferredDelete?
当函数slot_test()离开时,将出现"~Test()“消息。
我想我不明白qt文档中“当控件返回事件循环时对象将被删除”的真正含义。
有人能解释得更清楚些吗?
发布于 2018-07-20 11:14:07
从QCoreApplication::processEvents的文档中..。
如果您正在运行一个本地循环,该循环连续调用此函数,而没有事件循环,则 DeferredDelete事件将不会被处理--是我强调的。
如果你改变了..。
QCoreApplication::sendPostedEvents(0, 0);
QCoreApplication::processEvents(QEventLoop::AllEvents);为了..。
QCoreApplication::instance()->exec();那么你应该得到预期的行为。
(注:我知道用打电话给QCoreApplication::exec来阻塞MainWindow::slot_test不是一个长期的解决方案,但是.我猜从它的名称-- slot_test --这是一个Qt slot,无论如何都会在主事件循环的上下文中调用。在这种情况下,slot_test将返回到该事件循环,并在那里处理DeferredDelete事件。)
https://stackoverflow.com/questions/51440889
复制相似问题