如何从 QML 连接 C++ 对象的破坏信号?

Posted

技术标签:

【中文标题】如何从 QML 连接 C++ 对象的破坏信号?【英文标题】:How to connect a destroyed signal of C++ object from QML? 【发布时间】:2015-06-09 11:38:32 【问题描述】:

我想从 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 时没有打印任何内容。

【问题讨论】:

function()... 是什么? function()console.log("It destroyed!") 一个匿名函数,可以将一个词放到控制台,不是吗? 哦,那为什么要标记为 C++ 呢? 是的,这是我的错,我解决了这个问题。对不起... connect 应该与 SIGNAL 一起使用,而不是与 HANDLER 一起使用,即您应该使用 destruction.connect(参见上面的链接)。除此之外,qobj 是上下文属性吗? 【参考方案1】:

在一般情况下,您可以使用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 自己的析构函数中,这意味着您的子类上的任何属性或方法访问在那一点。

【讨论】:

qobj 是一个上下文属性,我只想连接来自 javascript 的信号。我试过qobj.onDestroyed.connect(...) 失败了。(TypeError: Cannot call method 'connect' of undefined) “是上下文属性”是什么意思?您是否使用setContextProperty 公开qobj?并且:正确的语法是:qobj.destroyed.connect(...)(不是on)。 qobj.destroyed 也是undefined @peppe 告诉你此类信号已被列入黑名单。就是这样,句号。 on.. 语法不能使用,这是错误的,正如我和 @peppe 所指定的那样。 好吧。我添加了一个自定义的销毁信号。谢谢大家。

以上是关于如何从 QML 连接 C++ 对象的破坏信号?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 访问特定 QML 控件的事件

如何从另一个线程的 cpp 代码同步调用 qml 信号处理程序?

如何在 QML 中访问 C++ 类对象,而不是在 QML 中创建单独的对象?

如何将信号从一个 qml 发送到另一个

C++ 和 QML:将 QML 信号连接到 C++ 插槽

使用信号或 Q_PROPERTY 更新 QML 对象