2012-05-16 2 views
3

У меня есть излучающий сигнал класса C++ и слот QML. Мне нужно выполнить слот в том же потоке после того, как программа вернется в цикл событий.Qt :: QueuedConnection from QML

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

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

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

ответ

2

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

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

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

+0

Выглядит неплохо, но это заставляет меня сделать все мои объекты из QObject, которые мне не нравятся. – psyched

+0

Да, у вас будет такое ограничение с помощью этого решения –

2

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

Например

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^