Существует автономный пример задачи:Slider элемент поддерживает сброс целевого значения до минимального значения слайдера
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
сохранит свое правильное значение после того, как слайдер будет закрыт, но в тот момент, когда он снова откроется, значение снова развращается.
Почему это происходит, как его предотвратить? Казалось бы, по какой-то объяснимой причине свойство slider value
временно принимает значение minimumValue
, но это не похоже на адекватное поведение. Может быть, ошибка? Ползунок никогда не принимает правильное начальное значение, даже если value: rect.v
перемещается перед установкой минимального значения.
Вы не должны полагаться на 'valueChanged' вообще, поскольку, как и все другие обработчики, вызывается при каждом изменении значения, даже начальные присваивания. Плохой выбор дизайна? Вы можете спорить об этом, но так оно и работает. Вместо этого привяжите значение к значению ползунка: значение обновляется с помощью ползунка. Что-то вроде [этого] (http://pastebin.com/raw/62cXrMqz). – BaCaRoZzo
@BaCaRoZzo Ваш код абсурден, очевидно, что ползунок разрушен после того, как была выполнена настройка, привязка целевого значения к значению слайдера - самое худшее «решение» проблемы и фактически даже не решение. Если ползунок был правильно реализован, установка значения ползунка в целевое значение не будет возвращаться к целевому значению, так как значение будет одинаковым. В слайдере есть изменение паразитного значения, и да, паразитное непреднамеренное поведение - плохой дизайн. И это плохой дизайн, который предотвращает использование компонента самым чистым и самым логичным способом. – IvanB
Не будучи функциональным в стороне, ваше решение на самом деле предлагает привязать данные к пользовательскому интерфейсу, что само по себе является очень плохим дизайном. Пользовательский интерфейс связывается с данными, данные не должны зависеть от пользовательского интерфейса. Пользовательский интерфейс подходит для визуализации или взаимодействия с данными. – IvanB