来自QML的Qt :: QueuedConnection

时间:2012-05-16 08:47:31

标签: c++ qt qml

我有C ++类发射信号和QML插槽。我需要在程序返回事件循环后在同一个线程中执行slot。

我怎样才能达到这样的目标?

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

我需要这个,因为我无法执行deleteObject,在处理碰撞时,我需要在世界步骤之后执行此操作。

2 个答案:

答案 0 :(得分:2)

我不知道QML有多少,但我可以提供不同的方法: 看看QObject::deleteLater()

  

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

由于它是一个广告位,您可以将信号直接与bullet.deleteLater()相关联,也可以在deleteLater广告位内拨打deleteObject

答案 1 :(得分:2)

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

例如

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

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

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