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

【讨论】:

如何混合声明式和命令式代码?我只看到声明性代码。为什么不允许混合? @folibis childItem.childProperty: parentProperty 一点也不是必须的。您的答案甚至不起作用(并且在我的解决方法中没有添加任何内容);它仅在孩子更改而不是 parentProperty 时触发,这是正确的逻辑。 好的,您可以将事件更改为onParentPropertyChanged。我刚刚注意到您提供的代码中的那一行在语法上不正确。这里的赋值是命令式代码。

以上是关于qml中子属性的绑定属性的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 中删除属性上的 QML 绑定?

QML 中属性绑定求值的顺序和方式

在 QML 中更新对 var 属性的绑定

QML GroupBox:检测到属性“implicitWidth”的绑定循环

Qt 5.7 QML 为啥我的 CheckBox 属性绑定消失了?

检测到属性宽度的 QML 绑定循环(TextMetrics 行为怪异)