【发布时间】: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 中的一个属性改变了,所有依赖它的元素都会改变。