qt - "Bind"两个 QML CheckBox 在一起,确保它们的状态始终相同

标签 qt checkbox qml qtquick2 qtquickcontrols

我想在 GUI 的不同页面上创建两个复选框,以便它们在语义上是“相同”的复选框——相同的标签,相同的效果。 (将它们放在两个页面上只是为了方便用户。)

这需要将两个 CheckBox QML 元素“绑定(bind)”在一起,以便一个元素的状态始终由另一个元素反射(reflect),反之亦然。

这是equivalent to what's being asked here ,除了我使用 QML/JS 而不是 JS/JQuery。

我认为将每个复选框的 checked 状态绑定(bind)到某个全局持久属性的简单实现会起作用:

// Global shared state object
pragma Singleton
MySharedState {
    my_feature_on: false
}

然后,在两个单独的页面上,完全相同的 CheckBox 实例化:

// Checkbox implementation (on both pages
CheckBox {
    checked: MySharedState.my_feature_on
    onClicked: MySharedState.my_feature_on = checked
}

但是,这不起作用,因为单击复选框时,它会破坏初始的 checked 绑定(bind)。这是intended behavior, not a bug .

那么如何确保两个复选框始终共享相同的“选中”状态?

编辑:根据下面的评论,上述实现无需修改即可在随 Qt 5.7 一起发布的 Qt Quick Controls 2 中运行,因此此问题仅适用于 Qt 的早期版本(包括5.6,这是一个“长期支持”版本)。

最佳答案

单击复选框时,其 checked 属性将发生更改,并且原始 checked: MySharedState.my_feature_on 绑定(bind)将被删除。 您需要create a property binding from Javascript恢复原始绑定(bind),如 J-P Nurmi 在您链接的错误报告中所解释的那样。

为此,您必须使用 Qt.binding() .

CheckBox {
    checked: MySharedState.my_feature_on
    onClicked: { // the checked binding is removed since checked has been changed externally to the binding
        MySharedState.my_feature_on = checked
        checked = Qt.binding(function() {return MySharedState.my_feature_on}); //we restore the checked binding
    }
}

关于qt - "Bind"两个 QML CheckBox 在一起,确保它们的状态始终相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37840642/

相关文章:

Javascript 选中复选框时启用输入类型,未选中复选框时禁用

c++ - 如何以UI形式打开QML?

qt - 如何在 QML 中将 RowLayout 正确拆分为两个相等的字段?

c++ - Qt : Best approach to wait for a signal from a function

QT:构建时 Ui 不会刷新

c# - 在编辑模式下无法从 GridView 获取复选框值

javascript - 如何在angularjs中使用带有嵌套ng-repeat的复选框

qt - 设置SelectionDialog模型为继承QAbstractListModel的模型;没有项目显示

qt - 如何在 Qt UI 类中使用我的命名空间?

c++ - 如何在后台运行 QProcess?