Я использую коммерческую версию 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
..
Если вы запустите пример кода в этом вопросе, вы увидите, что my_rect_1
просто продолжает переключаться между двумя позициями вперед и назад, что на самом деле не соответствует логике. Цель логики состоит в том, чтобы продолжать увеличивать 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
и y
?
Потенциальное решение, которое я нашел в ходе поиска
Похоже на Перевести тип QML может быть полезен в логике, которую я хочу реализовать, но как?
Как я могу добиться такого поведения без написания функции QML, которая выполняет это преобразование отдельно вне my_rect_1
?