用于双向绑定的自定义组件的qml属性的默认强绑定

时间:2018-12-29 13:48:49

标签: qt data-binding qml

我想创建一个自定义组件,该组件允许使用以下(传统)设置进行双向绑定:

// main.qml
property var someStoredValue: someInitialValue // may be C++ property in real application
MyCustomComponent
{
    myProperty: someStoredValue // this binding will be destroyed on user input
    onMyPropertyChanged: someStoredValue = myProperty
}

// MyCustomComponent.qml
Item
{
    property var myProperty: null
    MouseArea
    {
        anchors.fill: parent
        onClicked: myProperty = "some text or other value" // breaks the binding set in main.cpp
    }
}

MyCustomComponent应该能够(以编程方式)更新myProperty,而不会破坏someStoredValuemyProperty之间的绑定。如何更改MyCustomComponent的实现以实现我的目标?

1 个答案:

答案 0 :(得分:0)

一种解决方案是使用Binding对象更新myProperty内部的MyCustomComponent,而不是直接更改值:

// MyCustomComponent.qml
Item
{
    property var myProperty: null
    Binding on myProperty
    {
        id: myPropertyUpdater
        function set(newValue) {value = newValue; when = true; when = false;}
        when: false
    }

    MouseArea
    {
        anchors.fill: parent
        onClicked: myPropertyUpdater.set("some text or other value")
    }
}

诀窍是将when的{​​{1}}属性设置为true,以传播新值。停用BindingBinding)后,如docs中所述,将恢复以前的任何直接绑定:

  

当绑定再次变为非活动状态时,   先前在该属性上设置的内容将恢复。