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

Я хочу подключить разрушенный сигнал C++ QObject из 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 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам