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

The timing to delete QObject using QObject::deleteLater()

样本:

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的实现是call
QCoreApplication::postEvent(这个,新的QDeferredDeleteEvent());

但为什么在 QCoreApplication::sendPostedEvents(0, 0) 之后的 运行 或 QCoreApplication::processEvents(QEventLoop::AllEvents 之后的 运行 时没有“~Test()”消息) ?

以上两个代码应该调度事件队列中的所有事件,包括QEvent::DeferredDelete?

退出函数 slot_test() 时出现“~Test()”消息。

我想我没看懂qt的文档中的真正含义"The object will be deleted when control returns to the event loop"

有人能解释得更清楚吗?

来自 QCoreApplication::processEvents...

的文档

In the event that you are running a local loop which calls this function continuously, without an event loop, the DeferredDelete events will not be processed [My emphasis].

如果你改变...

QCoreApplication::sendPostedEvents(0, 0);
QCoreApplication::processEvents(QEventLoop::AllEvents);

到...

QCoreApplication::instance()->exec();

然后你应该得到预期的行为。

(注意: 我知道通过调用 QCoreApplication::exec 来阻止你的 MainWindow::slot_test 不是一个长期的解决方案,但是......我'我从它的名字猜测 -- slot_test -- 这是一个 Qt slot 并且无论如何都会在主事件循环的上下文中调用。在这种情况下 slot_test将 return 到该事件循环并在那里处理 DeferredDelete 事件。)