滑块元素不断将目标值重置为滑块的最小值

Slider element keeps resetting target value to slider's minimum value

有一个独立的问题示例:

Rectangle {
    id: rect
    width: 200
    height: 200
    property real v : 50
    onVChanged: console.log(v)
    Button {
        onClicked: scomp.createObject(rect)
    }
    Component {
        id: scomp
        Rectangle {
            id: sli
            anchors.fill: parent
            Column {
                Slider {
                    width: 200
                    minimumValue: 10
                    maximumValue: 100
                    value: rect.v
                    onValueChanged: rect.v = value
                }
                Button {
                    onClicked: sli.destroy()
                }
            }
        }
    }
}

基本上,每次创建滑块组件以修改 v 时,都会将其设置为滑块的最小值。请注意,滑块仍可正常工作以修改该值,并且 v 将在滑块关闭后保留其正确的值,但再次打开时,该值将再次损坏。

为什么会出现这种情况,如何预防?似乎出于某种可解释的原因,滑块的 value 属性 暂时采用其 minimumValue 值,但这看起来并不合适。也许是一个错误?即使在设置最小值之前移动了 value: rect.v,滑块也不会真正采用正确的初始值。

没有挖掘Slider元素的实现,似乎实现顺序设计不当,初始值为0.0,因此将最小值设置为更高的值也会推高该值.如果值绑定到高于最小值的值并不重要,由于评估顺序,设置最小值时该值始终为 0.0,因此在这种格式中,目标值将始终被破坏为滑块的最小值。

我想出的解决方案通过延迟目标值绑定来避免这种行为,它有效,但它不是那么漂亮,所以我仍然对其他解决方案持开放态度,同时 Qt 伙计们 - 如果你看到这个你可能想修复 Slider:

Slider {
    width: 200
    minimumValue: 10
    maximumValue: 100
    value: rect.v
    Component.onCompleted: valueChanged.connect(function(){ rect.v = value})
}

这种格式最初还是将滑块值推到最小值,但是此时设置目标值的绑定还不存在,它是在滑块值取正确值后创建的。

这不是 Slider 中的错误,而是您对它的使用:

onValueChanged: rect.v = value

如果再添加一些调试语句:

qml: maximumValue = 100 value = 0
qml: minimumValue = 10 value = 10
qml: value = 10
qml: v = 10
void __cdecl QQuickRangeModel::setValue(double) 10
qml: in Component.onCompleted of Slider: value = 10 minimumValue = 10 maximumValue = 100

在它有机会完成加载之前,您已经将其 value 分配给 v。正确的解决方案取决于您没有提到的要求。例如,一种解决方案是改为在 Slider 中指定默认值,并将 v 绑定到 value:

v: slider ? slider.value : 0

it seems that the implementation order has been poorly designed

How would you design it?


要更新此答案,请使用 Slider from Qt Quick Controls 2, you should use the moved() signal 响应拖动的滑块。为此目的使用 onValueChanged 通常会导致问题。