首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用QObject::QObject()删除的时间

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

Stack Overflow用户
提问于 2018-07-20 10:49:41
回答 1查看 544关注 0票数 1

示例:

代码语言:javascript
复制
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文档中“当控件返回事件循环时对象将被删除”的真正含义。

有人能解释得更清楚些吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-20 11:14:07

QCoreApplication::processEvents的文档中..。

如果您正在运行一个本地循环,该循环连续调用此函数,而没有事件循环,则 DeferredDelete事件将不会被处理--是我强调的。

如果你改变了..。

代码语言:javascript
复制
QCoreApplication::sendPostedEvents(0, 0);
QCoreApplication::processEvents(QEventLoop::AllEvents);

为了..。

代码语言:javascript
复制
QCoreApplication::instance()->exec();

那么你应该得到预期的行为。

(注:我知道用打电话给QCoreApplication::exec来阻塞MainWindow::slot_test不是一个长期的解决方案,但是.我猜从它的名称-- slot_test --这是一个Qt slot,无论如何都会在主事件循环的上下文中调用。在这种情况下,slot_test将返回到该事件循环,并在那里处理DeferredDelete事件。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51440889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档