本文最后更新于 250 天前,其中的信息可能已经有所发展或是发生改变。
问题描述
最近在使用QML绑定C++暴露的变量时(这个暴露的变量的一些方法是我修改过的,正常定义的貌似不会):
CheckBox {
id: connectChecker
checked: rtc.connectChecker[index]//暴露的数组
onCheckedChanged: {
rtc.connectChecker[index] = checked;
}
}
会报这样的错误:
QML CheckBox: Binding loop detected for property "checked"
不只是checkbox,其他控件绑定属性都是如此
解决方法1
转载自 stack overflow:Binding Checkbox ‘checked’ property with a C++ object Q_PROPERTY
个人采用这种方法
用户单击复选框会破坏您创建的绑定。因此,不要创建绑定,而是直接连接到更改信号来处理“get”情况。使用“onClicked”来处理“set”情况。这个解决方案还需要在Component.onCompleted()中进行初始化。例如……
CheckBox {
id: myCheck
onClicked: user.status = checked
Component.onCompleted: checked = user.status
Connections {
target: user
onStatusChanged: myCheck.checked = user.status
}
}
解决方法2
转载自 stack overflow:Qt 5.4/Qml: Prevent binding loop
不要捆绑它。因为复选框不完全依赖于settings . somessetting。
当用户单击复选框时,checkbox。Checked是由自己更改的。同时,属性绑定不再有效。设置。用户单击复选框后,someessetting无法修改复选框。因此选中了:Settings。某些设置绑定错误。
如果你想在组件准备好时给复选框分配一个初始值,使用component。onCompleted赋值:
CheckBox {
id: someSettingCheckBox
Component.onCompleted: checked = Settings.someSetting
onCheckedChanged: Settings.someSetting = checked;
}
如果您正在处理更复杂的场景,则使用设置。在运行期间,someset可能会被其他一些东西改变,并且需要同时改变复选框的状态。捕获onSomeSettingChanged信号并显式更改复选框。只有当程序/小部件/对话框/xxx完成时,才将someesettingcheckbox的值提交给Settings。
CheckBox { id: someSettingCheckBox }
//within the Settings, or Connection, or somewhere that can get the signal.
onSomeSettingChanged: someSettingCheckBox.checked = someSetting