来自QML的Qt::QueuedConnection

3

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

我该如何实现类似这样的操作?

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

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

2个回答

2

很遗憾,在Connections组件中没有connectionType属性。但是一个简单的解决方法是,重新启动一个oneshot计时器,而不是直接在Connections信号处理程序中调用该方法。

例如:

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

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

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


2
我不太了解QML,但我可以提供一个不同的方法: 看一下QObject::deleteLater()
引用部分: 对象将在控制返回事件循环时被删除。
由于它是一个槽,所以您可以直接将信号连接到bullet.deleteLater(),或者在您的deleteObject槽内调用deleteLater

看起来不错,但这迫使我让所有的对象都派生自QObject,这一点我不喜欢。 - psyched
是的,使用这种解决方案会有这种限制。 - Tim Meyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接