QML:在没有双重分配的情况下检测到绑定循环

Posted

技术标签:

【中文标题】QML:在没有双重分配的情况下检测到绑定循环【英文标题】:QML: Bind loop detected without double assignment 【发布时间】:2017-12-15 20:24:06 【问题描述】:

据我所知,当我尝试相互分配两个属性时会发生绑定循环。示例:

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

但在我的场景中,我看不到这样的“双重分配”。我在这里报告完整代码:

import QtQuick 2.7
import QtQuick.Window 2.3

Window 
    visible: true;
    width: 500
    height: 500

    Rectangle 
        id: main
        anchors.fill: parent
        color: "black"

        property bool spinning: true
        property bool stopping: false

        Rectangle 
            x: 0.5 * parent.width
            y: 0.5 * parent.height
            width: 10
            height: 200
            radius: 5
            color: 'red'

            transformOrigin: Item.Top
            rotation: 
                if (main.stopping)
                
                    main.spinning = false;
                    main.stopping = false;
                

                return timer.angle
            
        

        Timer 
            id: timer
            interval: 5
            repeat: true
            running: true
            onTriggered: 
                if (main.spinning) angle += 1;
            
            property real angle
        

        MouseArea 
            id: control
            anchors.fill: parent
            onClicked: 
                main.stopping = true;
            
        
    

当你用鼠标点击你会得到警告:

qrc:/main.qml:17:9:QML 矩形:检测到属性“旋转”的绑定循环

我没有看到我的错误。我正在使用标志(布尔变量)来控制我的代码的执行。我知道在这种情况下我可以直接停止计时器,但实际程序比这个例子更复杂。

【问题讨论】:

我认为您的设计是错误的:为什么要使用 2 个标志:旋转和停止? 如前所述,这只是著名的 minimal and compilable 示例,以显示我面临的问题。我知道在这种简单的情况下不需要两个标志。但它们帮助我触发了我没有看到的绑定循环...... 绑定在以下几行:if (main.stopping) main.spinning = false; main.stopping = false; ,旋转的变化是由main.stopping的变化触发的:假设变化main.stopping是由mouseArea给定的,那么它会被称为轮换,但在这里面有一个 if,在这你要变回 main.stopping ,他会在这里调用轮换。 为什么会触发main.stopping的变化?它的状态不影响返回值timer.angle 如果它影响到它,如果 QML 中的一个属性改变了,所有依赖它的元素都会改变。 【参考方案1】:

绑定在以下几行:

rotation: 
    if (main.stopping)
    
        main.spinning = false;
        main.stopping = false;
    

    return timer.angle

旋转的改变是由main.stopping的改变触发的:假设改变main.stopping是由mouseArea给定的,那么它会被称为旋转,但是这里面有一个if,而在这里面你正在变回 main.stopping ,他将在这里调用轮换。

如果 QML 中的一个属性发生变化,所有依赖它的元素都会发生变化

【讨论】:

以上是关于QML:在没有双重分配的情况下检测到绑定循环的主要内容,如果未能解决你的问题,请参考以下文章

QML GroupBox:检测到属性“implicitWidth”的绑定循环

检测到属性宽度的 QML 绑定循环(TextMetrics 行为怪异)

QML ListView:检测到属性“高度”的绑定循环

标签上的绑定循环警告

Qt 5.4/Qml:防止绑定循环

Blazor:尝试保存项目时检测到对象循环