首页 > 解决方案 > 当一个项目从不同文件中的不同项目访问相同的值时,属性绑定在 Qml 中丢失

问题描述

StackOverflow 上有一堆 Qml Properties 问题,它们都与同一个文件中的项目相关,并且可以通过直接使用 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我尝试过的方式:Connections、Qt.bindings、Bindings on.. 在 SpinnerSlider.qml 中,但似乎没有任何效果。有什么提示吗?

标签: qtqml

解决方案


我设法通过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
}

推荐阅读