说我有一个可重复使用的组件:
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)不在每个更改处理程序中重复自己?
答案 0 :(得分:3)
用C ++编写属性的getter和setter。有关详细信息,请参阅integrating QML and C++文档。
即使Qt Quick Controls 1(几乎所有API都在QML中)都使用C ++类来管理其范围:
http://code.qt.io/cgit/qt/qtquickcontrols.git/tree/src/controls/Private/qquickrangemodel_p.h
如果你真的必须在QML中这样做,我建议你有一个可修改的属性和#34; public" (例如value
)和另一个readonly
和"私人" (例如_value
)以便您使用声明性代码而不破坏任何绑定:
readonly property int _value: Math.min(Math.max(0, value), range - 1);