我想在 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/