0

我有一个 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) )。另外,是否有可能获得另一个项目的中心?Like或'center 申请到的目标?my_item_2app_main_windowmy_item_2my_item_1

PS:
我已经简化了代码以使问题客观。my_item_1我的实际代码中有一个相当复杂的逻辑,我需要在不使用锚点的情况下将某些东西重新对齐到一个新的中心,因为QQuickitem我试图用它来缩放并平移到一个新点。

4

1 回答 1

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

于 2018-02-19T22:04:51.607 回答