2012-05-16 3 views
3

나는 C++ 클래스 방출 신호와 QML 슬롯을 가지고있다. 프로그램이 이벤트 루프로 돌아온 후에 같은 스레드에서 slot을 실행해야합니다.QML에서 Qt :: QueuedConnection

어떻게하면 좋을까요? 나는 충돌을 처리하는 동안, 나는 세계 단계 이후에이 작업을 수행 할 필요가, DeleteObject 매크로를 실행할 수 없기 때문에

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

나는이 필요합니다.

답변

2

내가 얼마나 QML에 대해 알고하지 않습니다하지만 난 다른 접근 방식을 제공 할 수 있습니다 : 는 QObject::deleteLater()

살펴 객체가 될 때 제어가 반환하는 이벤트 루프에 삭제됩니다 되세요. 이 슬롯이기 때문에

, 당신은 bullet.deleteLater()에 직접 신호를 연결하거나 deleteObject 슬롯 내에서 deleteLater를 호출 할 수 있습니다.

+0

멋지게 보이지만, QObject에서 파생 된 모든 객체를 만들도록 강요합니다. 마음에 들지 않습니다. – psyched

+0

예,이 솔루션으로 그 한계가 있습니다. –

2

불행히도 Connections 구성 요소에는 connectionType 속성이 없습니다. 그러나 간단한 해결 방법은 Connections signalHandler에서 직접 메서드를 호출하는 대신 oneshot 타이머를 다시 시작하는 것입니다. 팀 마이어 예를

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

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

뿐만 아니라

deleteLater를 사용하는 것이 더 쉬울 수 있습니다 귀하의 경우, 지적().

관련 문제