我有一个全局单例“设置”,其中包含应用程序设置。当我尝试运行以下代码时,我得到QML CheckBox: Binding loop detected for property "checked":

CheckBox {
    checked: Settings.someSetting
    onCheckedChanged: {
        Settings.someSetting = checked;
    }
}

很明显为什么会发生此错误,但是如何在没有绑定(bind)循环的情况下正确实现此功能?例如。我想将复选框的当前选中状态保存在设置单例中。

我正在使用Qt 5.4和Qml Quick 2。

问候,

最佳答案

不要 bundle 它。因为该复选框并不完全取决于Setting.someSetting

当用户单击复选框时,CheckBox.checked会自行更改。同时,属性绑定(bind)不再有效。用户单击后,Settings.someSetting无法修改CheckBox。因此,checked: Settings.someSetting绑定(bind)是错误的。

如果要在组件准备就绪时为复选框分配初始值,请使用Component.onCompleted进行分配:

CheckBox {
    id: someSettingCheckBox

    Component.onCompleted: checked = Settings.someSetting
    onCheckedChanged: Settings.someSetting = checked;
}

如果您在更复杂的场景中工作,则在运行时可能会通过其他一些方式更改Setting.someSetting,并且需要同时更改复选框的状态。捕获onSomeSettingChanged信号并显式更改复选框。仅在program/widget/dialog/xxx完成时才将someSettingCheckBox的值提交到Settings
CheckBox { id: someSettingCheckBox }

//within the Settings, or Connection, or somewhere that can get the signal.
onSomeSettingChanged: someSettingCheckBox.checked = someSetting

07-24 09:45