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

4

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


1
function(){...} 是什么? - Shoe
function(){console.log("它被摧毁了!")} 一个匿名函数,将一个单词输出到控制台,不是吗? - Zz Tux
哦,那这为什么被标记为C++呢? - Shoe
是的,这是我的错,我已经修正了问题。抱歉... - Zz Tux
connect 应该与 SIGNAL 一起使用,而不是 HANDLER,即应该使用 destruction.connect(请参见上面的链接)。除此之外,qobj 是一个上下文属性吗? - BaCaRoZzo
显示剩余2条评论
1个回答

8

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

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

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

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

然而:这对于特定的QObject::destroyed信号无效,它们被强制列入黑名单,永远不会在QML中可用(来源)。

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


qobj 是一个上下文属性,我想仅从 JavaScript 中连接它的信号。我尝试了 qobj.onDestroyed.connect(...) 但失败了(TypeError: Cannot call method 'connect' of undefined)。 - Zz Tux
“is a context property”是什么意思?您是否正在使用“setContextProperty”公开qobj?正确的语法应该是:“qobj.destroyed.connect(...)”(不是“on”)。 - peppe
qobj.destroyed δΙüφ‰· undefinedψIJ - Zz Tux
@peppe 告诉你这样的信号已被列入黑名单。就是这样,没有别的了。不能使用 on.. 语法,这是错误的,正如我和 @peppe 所指定的那样。 - BaCaRoZzo
1
好的。我添加了一个自定义的销毁信号。感谢大家。 - Zz Tux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接