如何从 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++ 对象的破坏信号?的主要内容,如果未能解决你的问题,请参考以下文章
如何从另一个线程的 cpp 代码同步调用 qml 信号处理程序?