Qt 如何将QQuickItem的位置转换为新的父项 我有2个QQueTask,像下面这样,我可以用QMLEngEngEngress这样的C++端获取。 QQuickItem * quick_item_1 = m_qml_engine->rootObjects()[0]->findChild<QQuickItem*>("quickitem1"); QQuickItem * quick_item_2 = m_qml_engine->rootObjects()[0]->findChild<QQuickItem*>("quickitem2"); quick_item_1->setParentItem(new_parent_surface); quick_item_2->setParentItem(new_parent_surface); quick_item_2->mapToItem(new_parent_surface, quick_item_2->position());

Qt 如何将QQuickItem的位置转换为新的父项 我有2个QQueTask,像下面这样,我可以用QMLEngEngEngress这样的C++端获取。 QQuickItem * quick_item_1 = m_qml_engine->rootObjects()[0]->findChild<QQuickItem*>("quickitem1"); QQuickItem * quick_item_2 = m_qml_engine->rootObjects()[0]->findChild<QQuickItem*>("quickitem2"); quick_item_1->setParentItem(new_parent_surface); quick_item_2->setParentItem(new_parent_surface); quick_item_2->mapToItem(new_parent_surface, quick_item_2->position());,qt,qml,qquickitem,Qt,Qml,Qquickitem,这对于在新的父项QQuickItem上绘制它们的目标来说非常有用。我在新的父曲面上绘制了quick_item_1和quick_item_2。即使新的父曲面没有在UI上绘制,但是如果我使用新的父曲面的快照,我可以看到在它们上绘制的两个项目。在这里之前都很好 但是,快速项目1和快速项目2的定位不正确。我希望它们的定位方式与原始父项的定位方式类似。我可以做一些百分比计算&尝试以与在原始父对象上绘制它们相同的方式对它们进行定位,但是否有一个QQQuickItem或qtapi来将此定位转换为新的父对象 我

这对于在新的父项QQuickItem上绘制它们的目标来说非常有用。我在新的父曲面上绘制了quick_item_1和quick_item_2。即使新的父曲面没有在UI上绘制,但是如果我使用新的父曲面的快照,我可以看到在它们上绘制的两个项目。在这里之前都很好

但是,快速项目1和快速项目2的定位不正确。我希望它们的定位方式与原始父项的定位方式类似。我可以做一些百分比计算&尝试以与在原始父对象上绘制它们相同的方式对它们进行定位,但是否有一个QQQuickItem或qtapi来将此定位转换为新的父对象

我试着研究QQuickItem的映射api,就像这样尝试它们

QQuickItem * quick_item_1 = m_qml_engine->rootObjects()[0]->findChild<QQuickItem*>("quickitem1");
QQuickItem * quick_item_2 = m_qml_engine->rootObjects()[0]->findChild<QQuickItem*>("quickitem2");
quick_item_1->setParentItem(new_parent_surface);
quick_item_2->setParentItem(new_parent_surface);
quick_item_2->mapToItem(new_parent_surface, quick_item_2->position());
但定位仍然不正确

因此,在执行?

项目后,如何将QQuickItem的位置映射到其新的父QQuickItem?位置始终相对于其父项。父对象的位置是相对于其父对象的,等等。但你总是可以得到相对或全球的位置。QML具有很多协调翻译功能。下面是一个可以解释这个问题的小例子:

import QtQuick 2.7
import QtQuick.Window 2.0
import QtQuick.Controls 2.1

Window {
    id:container
    width: 800
    height: 800
    visible: true

    Component {
        id: rect
        Rectangle {
            property bool imParent: false
            x: 50 + Math.round(Math.random() * 550)
            y: 50 + Math.round(Math.random() * 550)
            width: 100 + Math.round(Math.random() * 100)
            height: 100 + Math.round(Math.random() * 100)
            color: Qt.rgba(Math.random(),Math.random(),Math.random(),1);
            Drag.active: dragArea.drag.active
            MouseArea {
                id: dragArea
                anchors.fill: parent
                drag.target: parent
            }
            Text {
                anchors.centerIn: parent
                text: imParent ? "I'm parent" : "Drag me"
                color: "white"
            }
        }
    }

    Rectangle {
        id: blk
        x: 10
        y: 10
        z: 100
        parent: null
        height: 50
        width: 50
        radius: 5
        border.color: "white"
        color: "black"

    }

    Repeater {
        id: reptr
        model: 5
        property int pos: 0
        Loader {
            id: loader
            sourceComponent: rect
            onLoaded: {
                if(blk.parent == null) {
                    blk.parent = loader.item;
                    loader.item.imParent = true;
                }
            }
        }
    }

    Row {
        anchors.horizontalCenter: container.contentItem.horizontalCenter
        spacing: 2
        Button {
            text: "Reparent relative to parent"
            onClicked: {
                reptr.pos ++;
                if(reptr.pos >= reptr.model) {
                    reptr.pos = 0;
                }
                var item = reptr.itemAt(reptr.pos).item;
                blk.parent.imParent = false;
                blk.parent = item;
                blk.parent.imParent = true;
            }
        }
        Button {
            text: "Reparent relative to scene"
            onClicked: {
                reptr.pos ++;
                if(reptr.pos >= reptr.model) {
                    reptr.pos = 0;
                }
                var item = reptr.itemAt(reptr.pos).item;
                var coord = blk.mapToGlobal(blk.x, blk.y);
                blk.parent.imParent = false;
                blk.parent = item;
                blk.parent.imParent = true;
                coord = blk.mapFromGlobal(coord.x, coord.y);
                blk.x = coord.x;
                blk.y = coord.y;
            }
        }
    }
}

QQuickItem有很多mapTo*和manFrom*函数。顺便说一句,下次把你的代码放在这里,而不是解释它。由于代码中有其他内容,我认为最好描述相关问题。顺便说一句,如果我尝试使用一些值设置位置,那么当然我可以根据需要定位quick_item_2。但我很想知道是否有推荐的QQuickItemAPI来实现这一点