qml

时间:2016-06-21 08:30:33

标签: binding properties qml qtquick2

我在名为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
    }
}

这会在Cannot assign a value directly to a grouped property行上出现childItem.childProperty: parentProperty错误。我通过更改父级来解决此问题:

Item {
    property ChildItem childItem: null
    property var parentProperty
    //childItem.childProperty: parentProperty
    onParentPropertyChanged: childItem.childProperty = parentProperty
}

但这看起来非常人为。是否有更好的方法来做到这一点或其他建议以另一种方式改变结构?

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:-1)

好的,你的代码中有几个错误。逻辑和句法两者。

childItem.childProperty: parentProperty

这里不允许这一行,因为混合了声明性和命令式代码。如果childItem为空,那么会是什么?替换为:

onChildItemChanged: { 
    if(childItem)
        childItem.childProperty = parentProperty;
}

下一个错误:

childItem: childId

只需使用childId重新childID