qml中子属性的绑定属性
Posted
技术标签:
【中文标题】qml中子属性的绑定属性【英文标题】:Binding property of child property in qml 【发布时间】:2016-06-21 08:30:32 【问题描述】:我在一个名为 ChildItem.qml
的文件中有这个:
Item
property var childProperty
在另一个名为ParentItem.qml
的文件中,我创建了父项并尝试将childProperty
绑定到父项的属性:
Item
property ChildItem childItem: null
property var parentProperty
childItem.childProperty: parentProperty
在main.qml
中我实例化了两个对象并将父对象的引用绑定到子对象:
ApplicationWindow
ChildItem
id: childID
ParentItem
id: parentID
childItem: childID
这在childItem.childProperty: parentProperty
行上给我一个Cannot assign a value directly to a grouped property
错误。我通过如下更改父级来解决此问题:
Item
property ChildItem childItem: null
property var parentProperty
//childItem.childProperty: parentProperty
onParentPropertyChanged: childItem.childProperty = parentProperty
但这看起来和感觉都非常做作。有没有更好的方法来做到这一点或其他建议以另一种方式改变结构?
【问题讨论】:
【参考方案1】:childItem.childProperty: parentProperty
不幸的是,这在 QML 语法中是不可能的,尽管它会很好。限制是绑定只能在元素本身的声明中定义,例如在这种情况下,在 ChildItem ...
内。作为一种解决方法,Binding 元素可以在其他地方使用:
Binding
target: childItem
property: "childProperty"
value: parentProperty
但是,诚然,这也很笨拙。
我可能会尝试改变我的 QML 的结构以避免首先陷入这种情况,可能是这样的:
ApplicationWindow
ChildItem
id: childID
childProperty: parentID.parentProperty
ParentItem
id: parentID
【讨论】:
谢谢您,Binding
似乎可能是单线。不幸的是,第二个选项在我的场景中是不可能的,因为父/子对象必须在它们单独的文件中才能重用。【参考方案2】:
好的,您的代码中有几个错误。逻辑和句法的。
childItem.childProperty: parentProperty
由于混合了声明式和命令式代码,此处不允许使用此行。如果childItem
为空又会怎样?替换为:
onChildItemChanged:
if(childItem)
childItem.childProperty = parentProperty;
下一个错误:
childItem: childId
只需将childId
替换为childID
。
【讨论】:
如何混合声明式和命令式代码?我只看到声明性代码。为什么不允许混合? @folibischildItem.childProperty: parentProperty
一点也不是必须的。您的答案甚至不起作用(并且在我的解决方法中没有添加任何内容);它仅在孩子更改而不是 parentProperty
时触发,这是正确的逻辑。
好的,您可以将事件更改为onParentPropertyChanged
。我刚刚注意到您提供的代码中的那一行在语法上不正确。这里的赋值是命令式代码。以上是关于qml中子属性的绑定属性的主要内容,如果未能解决你的问题,请参考以下文章
QML GroupBox:检测到属性“implicitWidth”的绑定循环