Qt::QueuedConnection из QML

У меня есть сигнал, испускающий класс С++, и слот QML. Мне нужно выполнить слот в том же потоке после того, как программа вернется в цикл событий.

Как я могу добиться чего-то подобного?

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

Мне это нужно, потому что я не могу выполнить deleteObject, при обработке коллизии мне нужно сделать это после мирового шага.


person psyched    schedule 16.05.2012    source источник


Ответы (2)


Я не очень разбираюсь в QML, но могу предложить другой подход: взгляните на QObject::deleteLater()

Объект будет удален, когда управление вернется в цикл обработки событий.

Поскольку это слот, вы можете либо подключить свой сигнал напрямую к bullet.deleteLater(), либо вызвать deleteLater в своем deleteObject слоте.

person Tim Meyer    schedule 16.05.2012
comment
Выглядит красиво, но это заставляет меня делать все мои объекты производными от QObject, что мне не нравится. - person psyched; 16.05.2012
comment
Да, у вас было бы это ограничение с этим решением - person Tim Meyer; 16.05.2012

К сожалению, в компоненте Connections нет свойства connectionType. Но простой обходной путь — перезапустить одноразовый таймер вместо вызова метода непосредственно в обработчике сигналов Connections.

Например

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

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

Но, как указал Тим Мейер, в вашем случае может быть проще использовать deleteLater().

person Dynamo72    schedule 11.02.2016