如何从 QML 连接被破坏的 C++ 对象信号? [英] How to connect a destroyed signal of C++ object from QML?

查看:82
本文介绍了如何从 QML 连接被破坏的 C++ 对象信号?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to connect a destroyed signal of C++ QObject from QML so I did this:

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

But nothing is printed when I destroy qobj.

推荐答案

在一般情况下,您可以使用 Connections 元素:

In the general case, you can connect to signals emitted from a C++ object using a Connections element:

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

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

or in Javascript by calling the connect function on the corresponding property of the JS-mapped object:

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

<小时>

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


However: this doesn't work for the specific QObject::destroyed signals, which are forcibly blacklisted and never available in QML (source).

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

I guess the reason is that the object is gone from the QML context anyhow at that point, plus when that signal is emitted you're deep into QObject's own destructor, which means any property or method access on your subclass is invalid at that point.

这篇关于如何从 QML 连接被破坏的 C++ 对象信号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆