假设我有一个可重用的组件:
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);
}
// ...
但是,这将破坏另一个组件在使用我的组件时可能进行的任何绑定(bind)。
如何强制执行属性约束 (a) 而不破坏绑定(bind),以及 (b) 不在每个更改处理程序中重复自己?
最佳答案
用 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 中执行此操作,我建议您拥有一个可修改且“公共(public)”的属性(例如 value
),另一个是 readonly
和“private”(例如 _value
),以便您使用声明性代码而不破坏任何绑定(bind):
readonly property int _value: Math.min(Math.max(0, value), range - 1);
关于qml - 如何对 QML 属性实现约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48942209/