2

我知道从槽处理中删除 QObject 可能会使应用程序崩溃,因为它可能有其他排队事件。因此,我将使用 obj->deleteLater(),而不是使用“delete obj”。据我所知,obj 等待处理所有排队的事件,然后“删除 obj”。

QObject::~QObject () 所有进出对象的信号都会自动断开,并且该对象的任何未决发布的事件都会从事件队列中移除。但是,使用 deleteLater() 通常比直接删除 QObject 子类更安全。

但是,其他信号/槽进程呢?我的意思是,如果你连接了来自不同线程的对象的信号/插槽,如 Qt::QueuedConnection 或 Qt::BlockingQueuedConnection。它们是否已出队以进行处理?

提前致谢。

4

2 回答 2

2

deleteLater将从对象所属的线程中删除对象。Qt::QueuedConnectionQt::BlockingQueuedConnection(also Qt::AutoConnection) 以这种方式工作,即从具有插槽的对象所属的线程的事件循环调用插槽。
因此,如果您添加到您发布的此报价中,这意味着Qt::*QueuedConnection当对象被销毁时,任何未决的都将被自动解除。这意味着您在使用这些连接时是安全的,并且deleteLater. 当您将使用Qt::DirectConnection不同的线程时,或者当您尝试delete pointer;从错误的线程直接销毁对象()时,可能会出现问题。

于 2013-08-29T08:29:17.847 回答
0

根据 Qt 文档

当控制返回事件循环时,该对象将被删除。如果调用此函数时事件循环没有运行(例如 deleteLater(),在之前对对象调用过QCoreApplication::exec()),则一旦启动事件循环,该对象将被删除。如果 deleteLater()在主事件循环停止后调用,对象将不会被删除。从 Qt 4.8 开始,如果deleteLater()在没有运行事件循环的线程中调用对象,则该对象将在线程完成时被销毁。

请注意,进入和离开新的事件循环(例如,通过打开模式对话框)不会执行延迟删除;对于要删除的对象,控件必须返回到从中 deleteLater()调用的事件循环。

注意:多次调用该函数是安全的;当第一个延迟删除事件被传递时,该对象的所有未决事件都将从事件队列中删除。

InQt::QueuedConnection类型deleteLater()会等待线程完成。但是Qt::DirectConnection当任何人直接删除对象时,它可能会导致应用程序崩溃。在这种情况下,您需要在删除之前检查线程是否正在运行。

于 2018-05-17T10:42:29.420 回答