我有一个全局单例“设置”,其中包含应用程序设置。当我尝试运行以下代码时,我得到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