Qt::来自QML的QueuedConnection 我有C++类发射信号和QML时隙。在程序返回到事件循环后,我需要在同一线程中执行slot

Qt::来自QML的QueuedConnection 我有C++类发射信号和QML时隙。在程序返回到事件循环后,我需要在同一线程中执行slot,c++,qt,qml,C++,Qt,Qml,我怎样才能做到这一点 Connections { target: box2dCppEngine onBulletCollided: box2dCppEngine.deleteObject(bullet) connectionType: Qt.QueuedConnection } 我之所以需要它,是因为我无法执行deleteObject,在处理碰撞时,我需要在world步骤之后执行此操作。我不知道QML有多少功能,但我可以提供一种不同的方法: 看看 当控件返回到事件循环时

我怎样才能做到这一点

Connections {
    target: box2dCppEngine
    onBulletCollided: box2dCppEngine.deleteObject(bullet)
    connectionType: Qt.QueuedConnection
}

我之所以需要它,是因为我无法执行deleteObject,在处理碰撞时,我需要在world步骤之后执行此操作。

我不知道QML有多少功能,但我可以提供一种不同的方法: 看看

当控件返回到事件循环时,对象将被删除


由于它是一个插槽,您可以将信号直接连接到
bullet.deleteLater()
,或者在
deleteObject
插槽中调用
deleteLater

不幸的是,Connections组件中没有connectionType属性。但一个简单的解决方法是重新启动一个一次性计时器,而不是直接在Connections signalHandler中调用该方法

比如说

Connections {
    target: box2dCppEngine
    onBulletCollided: timerHelper.restart()
}

Timer {
    id: timerHelper
    interval: 1
    onTriggered: box2dCppEngine.deleteObject(bullet)
}

但正如Tim Meyer所指出的,在您的情况下,使用deleteLater()可能更容易。

看起来不错,但这迫使我将所有对象都派生自QObject,这是我不喜欢的。是的,使用此解决方案,您可能会有此限制