gpt4 book ai didi

c++ - Qt 5.4/Qml : Prevent binding loop

转载 作者:可可西里 更新时间:2023-11-01 17:01:37 25 4
gpt4 key购买 nike

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

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

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

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

问候,

最佳答案

不要绑定(bind)它。因为复选框并不完全依赖于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 信号并显式更改复选框。仅当程序/widget/dialog/xxx 完成时,才将someSettingCheckBox 的值提交给Settings

CheckBox { id: someSettingCheckBox }

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

关于c++ - Qt 5.4/Qml : Prevent binding loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28250710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com