如何对QML属性强制实施约束

如何对QML属性强制实施约束,qml,Qml,假设我有一个可重用组件: import QtQuick 2.9 import QtQuick.Controls 2.3 Control { id: root property int range property int value // ... implementation... } 我希望将range限制为1或更高,并且value介于0和range-1之间。在Javascript中实现此功能可能如下所示: Control { id: root

假设我有一个可重用组件:

import QtQuick 2.9
import QtQuick.Controls 2.3

Control {
    id: root

    property int range
    property int value

// ... implementation...

}
我希望将
range
限制为1或更高,并且
value
介于0和
range-1
之间。在Javascript中实现此功能可能如下所示:

Control {
    id: root

    property int range
    property int value

    onValueChanged: {
        value = Math.min(Math.max(0, value), range-1);
    }

    onRangeChanged: {
        range = Math.max(value, 1);
        value = Math.min(Math.max(0, value), range-1);
    }

// ...
然而,这将破坏其他组件在使用我的组件时可能进行的任何绑定


如何在不中断绑定的情况下执行属性约束(a),(b)不在每个更改处理程序中重复自己?

在C++中写入属性的吸收器和设置器。有关详细信息,请参阅文档

Qt快速控件1(几乎每个API都在QML)使用C++类来管理其范围:

如果您真的必须在QML中执行此操作,我建议您使用一个可修改且“公共”(例如
)的属性,以及另一个
只读
和“私有”(例如
\u值
)的属性,以便对其使用声明性代码,而不破坏任何绑定:

readonly property int _value: Math.min(Math.max(0, value), range - 1);

嗯,这可能也是我问的另一个问题的最佳答案:。