Qt 向组件用户发出绑定属性不安全的信号

Qt 向组件用户发出绑定属性不安全的信号,qt,qml,qt5,Qt,Qml,Qt5,我发现以下QML组件: 让我们称之为“MyRect.qml”。由于MyRect会覆盖状态属性,因此将其绑定到属性将不起作用: Item { id: root MyRect { id: inner state: root.state // not safe } } 但是,分配它将起作用: Item { id: root onStateChanged: inner.state = root.state // safe

我发现以下QML组件:

让我们称之为“MyRect.qml”。由于MyRect会覆盖
状态
属性,因此将其绑定到属性将不起作用:

Item {
    id: root

    MyRect {
        id: inner

        state: root.state // not safe
    }
}
但是,分配它将起作用:

Item {
    id: root

    onStateChanged: inner.state = root.state // safe

    MyRect {
        id: inner
    }
}
另一方面,对于
MyRect.qml
的属性
width
,绑定和赋值都是安全的

MyRect.qml
的用户如何在不检查源代码的情况下知道哪些属性可以安全绑定,哪些属性不能绑定

你不能。
特别是对于
状态
,使用根节点状态作为内部状态是个坏主意。应该使用隐藏(内部)对象的状态,也可以直接使用或

除此之外,您还需要使用
绑定
-对象。这些不能被覆盖。因此,如果你举个例子:

Item {
    id: root

    Binding {
        target: inner
        property: 'state'
        value: root.state
    }

    MyRect {
        id: inner
    }
}
每当根状态发生状态更改时,应覆盖内部值


一般来说,更重要的是确保内部绑定不被重写,因此在创建可重用组件时,只要您想将一个公开的属性绑定到内部值,就应该使用
绑定
-对象。

您期望什么?绑定只是单向的,因此当您将一个新值赋给
state
时,您有两个相互竞争的赋值:外部对象告诉它是
,而内部对象告诉它是
“clicked”
。不能两者兼而有之,所以qml需要做出决定并采取最后一个。问题是组件的用户不知道这一点,因为组件的源代码未知。最好使用组件创建者的功能扩展QML,以表明这一点。
Item {
    id: root

    Binding {
        target: inner
        property: 'state'
        value: root.state
    }

    MyRect {
        id: inner
    }
}