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

时间:2018-02-19 21:22:45

标签: qt qml qtquick2 qquickitem

我有一个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获得时将my_item_2的中心更改为新的中心( Qt.point(some_x_center,some_y_center))点击事件。 另外,是否可以获得另一个项目的中心?与app_main_windowmy_item_2的中心一样适用于目标my_item_1

PS:
我已经使代码变得简单,使问题成为目标。在我的实际代码中我有一个非常复杂的逻辑,我需要将my_item_1之类的东西重新调整到一个新的中心而不使用锚点作为QQuickitem我试图用它来缩放和平移成一个新观点。

1 个答案:

答案 0 :(得分:1)

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

快速举例:

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()来调整坐标。