3

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

我怎样才能实现这样的目标?

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

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

4

2 回答 2

2

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

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

由于它是一个插槽,因此您可以将信号直接连接到bullet.deleteLater(),或deleteLaterdeleteObject插槽内调用。

于 2012-05-16T09:16:58.360 回答
2

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

例如

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

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

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

于 2016-02-11T11:37:15.330 回答