【问题标题】:"Bind" two QML CheckBoxes together, ensuring their states are always identical将两个 QML 复选框“绑定”在一起,确保它们的状态始终相同
【发布时间】:2016-06-15 16:12:07
【问题描述】:

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

这需要将两个CheckBox QML 元素“绑定”在一起,这样一个元素的状态总是被另一个元素反映,反之亦然。

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

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

// 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 绑定。这是intended behavior, not a bug

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

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

【问题讨论】:

  • 对于它的价值,在 Qt 5.7 中发布的 Qt Quick Controls 2 中,可以直接或通过此类共享状态对象将两个 CheckBox 相互绑定。
  • @J-PNurmi 太棒了。我已经编辑了问题以记录下来。谢谢。

标签: qt checkbox qml qtquick2 qtquickcontrols


【解决方案1】:

当一个复选框被点击时,它的checked 属性被改变并且原来的checked: MySharedState.my_feature_on 绑定被移除。 您需要 create a property binding from Javascript 以恢复原始绑定,如 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
    }
}

【讨论】:

  • 太棒了。我一直想知道绑定是否可以在 JS 上下文中显式分配但没有研究过——即使在这个特定实例之外,这似乎也是一个非常有用的技巧。
【解决方案2】:

使用Binding 类型的双向绑定有效:

import QtQuick 2.5
import QtQuick.Controls 1.0

ApplicationWindow {
    objectName: "window"
    width: 600
    height: 200
    visible: true

    Row {
        CheckBox {
            id: checkBox1
            text: "Check Box 1"
        }

        CheckBox {
            id: checkBox2
            text: "Check Box 2"
        }
    }

    Binding {
        target: checkBox2
        property: "checked"
        value: checkBox1.checked
    }

    Binding {
        target: checkBox1
        property: "checked"
        value: checkBox2.checked
    }
}

虽然我不确定它为什么不抱怨绑定循环。

【讨论】:

  • 我觉得很奇怪,绑定循环没有错误——也许是因为check 属性没有发出checked 信号t实际上改变了吗?这里的另一个奇怪之处是,当单击复选框时,显式 Binding 对象没有断开,标准 checked: 属性分配的方式是。这个解决方案似乎确实有效,但我想我会使用另一个,因为它对我来说更有意义并且看起来更明确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2011-02-11
  • 1970-01-01
  • 2020-09-29
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多