QML报警绑定循环(binding loop)
本文最后更新于 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
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇