QML:检测到绑定循环而没有双重赋值

时间:2017-12-15 20:24:07

标签: qt qml qt5

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

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矩形:为属性"旋转"

检测到绑定循环

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

1 个答案:

答案 0 :(得分:2)

绑定如下:

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

    return timer.angle
}

旋转的变化是由main.stopping的变化触发的:让我们说更改main.stopping是由mouseArea给出的,然后它会被称为旋转,但是在这里有一个if,在这里你将改回main.stopping,在那里他将召回回旋。

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