繁体   English   中英

当项目从不同文件中的不同项目访问相同的值时,属性绑定在Qml中丢失

[英]Property bindings getting lost in Qml when an Item accesses same value from different items in different files

在StackOverflow上有很多Qml属性问题,它们都与同一文件中的项目有关,并且可以通过直接使用Connections或Binding轻松解决。 但是,如果Qml对象由于缺少绑定而失去与外部的连接,会发生什么?

我创建了一个“ Spinner Slider”,这是一个具有相同值的Spinner和Slider:

SpinnerSlider.qml

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.3

RowLayout {
    id: root

    property alias value: sliderControl.value
    property alias from: sliderControl.from
    property alias to: sliderControl.to

    Slider {
        id: sliderControl
        Layout.fillWidth: true
        stepSize: 1
        wheelEnabled: true
    }

    SpinBox {
        id: spinBox
        from: root.from
        to: root.to
        value: root.value
        stepSize: sliderControl.stepSize
        editable: true
        onValueChanged: root.value = value
    }
}

我想以以下方式使用,两个滑块,一个在另一个之上。 修改顶部的值应该更改底部的值,更改底部的值应该什么都不做。

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    Column {
        anchors.fill: parent

        SpinnerSlider {
            id: outerSlider
            from: 0
            to: 500
            value: 50
        }

        SpinnerSlider {
            id: innerSlider
            from: 0
            to: 500
            // Does Not Work
            // value: outerSlider.value

            // Works
            Connections {
                target: outerSlider
                onValueChanged: innerSlider.value = outerSlider.value
            }

            // Works
            Binding on value {
                 value: outerSlider.value
            }
        }
    }
}

根据代码中的注释,如果我使用“常规”的方式连接Qml上的value: something.value ,则一旦更改SpinBox上的值,该代码将无法正常工作,因为onValueChange将触发并且将通过有效地为其设置一个常量来删除属性绑定。

我真正想要的是能够使用value: outerSlider.value方法。我尝试过的操作:SpinnerSlider.qml中的连接,Qt.bindings,Bindings on ..,但似乎没有任何作用。 有什么提示吗?

我设法通过多次使用Binding on来修复代码。 这样,我不会破坏外部绑定。

Binding on value {
    when: sliderControl.pressed
    value: sliderControl.value
}

Binding on value {
    when: spinBox.up.pressed
    value: spinBox.value
}

Binding on value {
    when: spinBox.down.pressed
    value: spinBox.value
}

Binding on value {
    when: spinBox.focus
    value: spinBox.value
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM