我使用的是Qt 5.9.3商业版。
场景
我有逻辑要在我的代码的 Qt QML 部分中执行。点击一些随机按钮。我想将 QML 矩形移动到另一个位置。另一个位置是(x, y) position
根据矩形的当前位置计算的。
以下是我想做的事情:
代码:
import QtQuick 2.9
import QtQuick.Window 2.2
Window {
visible: true
width: 800
height: 600
title: qsTr("Hello World")
property bool some_boolean_flag: false
Rectangle {
id: my_rect_1
color: "blue"
width: parent.width / 4
height: parent.height / 4
z:1
property real current_x
property real current_y
x: {
if (some_boolean_flag) {
current_x = current_x + current_x/10
return current_x
}
else {
var default_x = parent.width/6
current_x = default_x
return current_x
}
}
y: {
if (some_boolean_flag) {
current_y = current_y + current_y/10
return current_y
}
else {
var default_y = parent.height/6
current_y = default_y
return current_y
}
}
}
Rectangle {
id: my_rect_2
color: "yellow"
width: parent.width/5
height: parent.height/5
x: parent.width - parent.width/4
y: parent.height - parent.height/4
z:2
MouseArea {
anchors.fill: parent
onClicked: {
// swapping the boolean flag between true and false
some_boolean_flag = !some_boolean_flag
}
}
}
}
这个问题的目的:
请注意,我想以声明方式进行计算。我可以轻松地创建一个QML 函数并声明一些全局属性,这当然很容易,但进行此计算并不是问题的重点。我的目标是学习如何以声明方式执行此操作。如何QQuickItem::x
根据QQuickItem::x
的当前值本身对 a 应用计算..
如果您运行这个问题中的示例代码,您会看到它my_rect_1
只是在 2 个位置之间来回交换,这不是逻辑的真正意图。逻辑的目的是保持递增my_rect_1::x
,并保持my_rect_1::y
一定的因子,my_rect_1
当您继续单击另一个矩形时,这将导致向右和向下移动my_rect_2
。
另一个问题是,当我单击时,我在运行时
不断收到以下错误my_rect_2
。
qrc:/main.qml:12:5: QML Rectangle: Binding loop detected for property "x"
我知道QML
是在抱怨属性的循环x
依赖my_rect_1
。我怎样才能避免这种情况并实现转换的声明方式x
and y
?
我从搜索中找到的
潜在解决方案
如何在不编写在外部单独进行此转换的 QML 函数的情况下实现此行为 my_rect_1
?