2015-06-09 5 views
4

Я хочу соединить разрушенную сигнал C++ QObject из QML, так что я сделал это:Как подключить разрушенный сигнал объекта C++ из QML?

Rectangle 
{ 
    id: root 
    width: 128 
    height: 128 

Button 
{ 
    anchors.centerIn: parent 
    text: "Click me" 
    onClicked: 
    { 
     qobj.Component.onDestruction.connect(function(){console.log("It destroy")}) // qobj is set from c++ 
     qobj.destroy() // should output "It destroy" 
    } 
} 

Но ничего не печатается, когда я уничтожу qobj.

+1

Что такое 'function() {...}'? – Shoe

+0

'function() {console.log (« It destroy! »)}' Анонимная функция, которая помещает слово в консоль, не так ли? –

+0

О, почему это помечено C++? – Shoe

ответ

5

В общем случае, вы можете подключить к сигналам, испускаемых из C++ объект, используя Connections элемент:

Connections { 
    target: yourObjectComingFromCpp 
    onSomeSignal: console.log("Something") 
} 

или Javascript, вызвав connect функцию на соответствующем свойстве JS-отображенного объекта:

// without the *on*! 
yourObjectComingFromCpp.someSignal.connect(/* JS function here */); 

Однако: это не работает для конкретного QObject::destroyed, которые принудительно занесены в черный список и никогда не доступны в QML (source).

Я полагаю, причина в том, что объект ушел из контекста QML так или иначе в этот момент, плюс когда этот сигнал испускается, вы глубоко погружаетесь в собственный деструктор QObject, что означает, что любой доступ к свойствам или методам в вашем подклассе недействителен в таком случае.

+0

'qobj' - свойство контекста, и я хочу подключать его сигналы только от javascript. Я попробовал 'qobj.onDestroyed.connect (...)' и не удалось. ('TypeError: Невозможно вызвать метод 'connect' undefined') –

+0

Что вы имеете в виду под« является свойством контекста »? Вы показываете 'qobj', используя' setContextProperty'? И: правильный синтаксис был бы следующим: 'qobj.destroyed.connect (...)' (not * on *). – peppe

+0

'qobj.destroyed' также' undefined'. –

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