如何从 QML 连接 C++ 对象的销毁信号?

How to connect a destroyed signal of C++ object from QML?

我想从 QML 连接一个被破坏的 C++ QObject 信号,所以我这样做了:

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 时什么也没有打印出来。

在一般情况下,您可以使用 Connections 元素连接到从 C++ 对象发出的信号:

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

或者在Javascript中调用JS映射对象对应属性的connect函数:

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

但是:这不适用于特定的 QObject::destroyed 信号,这些信号被强制列入黑名单并且在 QML (source) 中永远不可用。

我想原因是该对象在那个时候无论如何都从 QML 上下文中消失了,加上当发出该信号时,您深入到 QObject 自己的析构函数中,这意味着任何 属性 或方法访问那时你的子类是无效的。