Как проверить значение свойства Qml перед назначением?
Element.qml
Item{
property int step
property int minValue
property int maxValue
property int value //should accept values of form i*step+minValue
}
main.qml
Element{
step:2
minValue:-7
maxValue:7
value:0 //not an acceptable value(2*i-7), should convert to 1 or -1
}
Если я установлю значение, оно должно преобразовать значение в ближайшее step*i+minValue
т.е. 0
в 1
а затем испустить valueChanged()
,
Я хочу valueChanged()
сигнал будет излучаться только тогда, когда его значение step*i+minValue
,
2 ответа
Вы не можете сделать предварительный тест, и на него будет отправлен сигнал valueChanged. Единственное решение состоит в том, чтобы выполнить тест в слоте onValueChanged и отправить пользовательский сигнал, в большинстве случаев вы не отправляете сигнал valueChanged(), поскольку он подключен к слоту onValueChanged.
import QtQuick 2.2
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.2
Item{
property int step :2
property int minValue :-7
property int maxValue: 7
property int value: 0 //should accept values of form i*step+minValue
signal sgnValueChanged(int value)
Column{
TextInput{
id:input
width: 100
height: 20
}
Rectangle{
id:button
width: 100
height: 20
color:"#f0ffff"
MouseArea{
anchors.fill:parent
onClicked:
{
value = parseInt(input.text)
}
}
}
}
onValueChanged:
{
if(value >= minValue && value <= maxValue)
{
sgnValueChanged(step * value + minValue)
}
else
{
console.log("not acceptable value")
}
}
}
Насколько я знаю, нет способа установить валидатор свойства. Возможный обходной путь показан ниже. Рассмотрим, например, свойство, которое принимает только положительные числа. Такое свойство может быть закодировано следующим образом:
Item {
property int value: 0
property int _value: 0
on_ValueChanged: {
if(_value > 0)
value = _value;
}
}
Тот же подход можно использовать в C++, если Item
это ваш пользовательский класс.