使用QObject :: deleteLater()删除QObject的时间

时间:2018-07-20 10:49:41

标签: qt qobject

示例:

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文档中“当控件返回事件循环时该对象将被删除”的真实含义。

有人可以更清楚地解释吗?

1 个答案:

答案 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事件。)