3

シグナルと QML スロットを放出する C++ クラスがあります。プログラムがイベントループに戻った後、同じスレッドでスロットを実行する必要があります。

どうすればこのようなことを達成できますか?

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 に答える