滑块元素不断将目标值重置为滑块的最小值
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
要更新此答案,请使用 Slider from Qt Quick Controls 2, you should use the moved() signal 响应拖动的滑块。为此目的使用 onValueChanged
通常会导致问题。
有一个独立的问题示例:
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
要更新此答案,请使用 Slider from Qt Quick Controls 2, you should use the moved() signal 响应拖动的滑块。为此目的使用 onValueChanged
通常会导致问题。