如何将 QQuickItem 的中心转换为新的中心

How to transform the center of a QQuickItem to a new center

我有一个 Qt QML 应用程序。以下是应用程序的完整代码:

代码:

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    id: app_main_window
    visible: true
    width: 800
    height: 600
    title: qsTr("Hello QML")

    Rectangle {
        id: my_item_1
        x: 100
        y: 100
        width: 100
        height: 100
        color: "grey"
        visible: true
        z: 1
    }

    Rectangle {
        id: my_item_2
        x: 400
        y: 400
        width: 100
        height: 100
        color: "grey"
        visible: true
        z: 1

        MouseArea {
            anchors.fill: parent
            onClicked: {
                // How can I change the center of my_item_1  to some arbitrary new center. lets say app_main_window's center. this involves another question. how can I get app_main_window's center?
            }
        }
    }
}

问题:
我的问题很简单。 如何将任何QQuickitem中心更改为新的中心?所以在上述情况下 如何 可以将 my_item_1 的中心更改为新的中心 (Qt.point(some_x_center, some_y_center)) 当my_item_2 得到一个点击事件。 另外,是否可以获取另一个项目的中心?喜欢 app_main_windowmy_item_2 的中心以应用到目标 my_item_1?

PS:
我已经使代码变得简单来使问题objective。我的实际代码中有一个相当复杂的逻辑,我需要在不使用锚点的情况下将 my_item_1 之类的东西重新对齐到新中心,因为 QQuickitem 我正在尝试这样做,它被缩放和平移到一个新点。

如果无法使用锚点,您必须手动计算中心并分配它。

快速示例:

Item
{
    anchors.fill: parent

    Rectangle
    {
        id: nonParentOrSibling
        width: 200
        height: 200
        x: 350
        y: 240
        color: "red"
    }

}

Rectangle
{
    id: rectToMove

    width: 100
    height: 100
    y: 200
    color: "blue"

    MouseArea
    {
        anchors.fill: parent
        onClicked:
        {
            var itemCenter = Qt.point(nonParentOrSibling.x + nonParentOrSibling.width / 2, nonParentOrSibling.y + nonParentOrSibling.height / 2)
            rectToMove.x = itemCenter.x - rectToMove.width / 2
            rectToMove.y = itemCenter.y - rectToMove.height / 2
        }
    }
}

请注意,这是一次性移动,如果目标移动,矩形不会移动。

要使其跟随目标,您必须使用 Qt.binding 重新绑定它。

如果rectToMove和nonParentOrSibling不在同一个坐标系,可以用Item.mapToItem()mapFromItem()适配坐标