如何对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);
嗯,这可能也是我问的另一个问题的最佳答案:。