使用 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 事件。)
样本:
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 事件。)