Как проверить значение свойства 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 это ваш пользовательский класс.

Другие вопросы по тегам