【问题标题】:How to connect a destroyed signal of C++ object from QML?如何从 QML 连接 C++ 对象的破坏信号?
【发布时间】: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 是上下文属性吗?

标签: javascript qt qml qtquick2


【解决方案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 所指定的那样。
  • 好吧。我添加了一个自定义的销毁信号。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多