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

时间:2018-02-23 06:16:25

标签: 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

    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)不在每个更改处理程序中重复自己?

1 个答案:

答案 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);