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

    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/

相关文章:

c++ - 模块项中的 QQmlComponent

javascript - GC 导致 QML 应用程序崩溃

qt - 选择后 ComboBox QML 不显示项目文本

c++ - QML 与 CPP 交互 : property double results in NaN

qt - 使用 Qt Quick 创建一个可扩展、有光泽/有光泽的按钮

qt - 更改动画目标

c++ - QML/C++ 问题中的 Unicode

qt - 使用 QML 创建上下文菜单

javascript - 使用 Qt.include(...) 导入 js 文件时缺少 QtCreator 智能感知

qt - 根据 qml 中的内容获取项目高度的正确方法?