0

我有 2 s,如下所示,我可以使用这样QQuickItem的方法在 C++ 端获取。QMLEngine

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的直接父级不同&quick_item_2的直接父级也不同。但是它们都在同一个应用程序窗口中绘制到不同的直接父级中。

我在不同的QQuickItem. 让我们称之为new_parent_surfacenew_parent_surface我通过将它们的父项更改为new_parent_surface这样来绘制这两个项目。

quick_item_1->setParentItem(new_parent_surface);
quick_item_2->setParentItem(new_parent_surface);

这对于将它们绘制在新的父 QQuickItem 上的目标很好。我得到了两者quick_item_1&quick_item_2绘制new_parent_surface。即使new_parent_surface没有在 UI 上绘制,但如果我使用grabToImage of拍摄快照new_parent_surface,我可以看到在它们上绘制的 2 个项目。到这里为止很好。

但是&的定位是不正确的。我想将它们定位为类似于它们放置原始父项的方式。我可以做一些百分比数学并尝试以与在其原始父级上绘制相同的方式定位它们,但没有 QQQuickItem 或 Qt API 可以将此定位转换为新父级吗?quick_item_1quick_item_2

我试图研究 QQuickItem 的映射 API,如mapToItem并像这样尝试它们。

quick_item_2->mapToItem(new_parent_surface, quick_item_2->position());

但定位仍然不正确。

那么,在执行setParentItem之后,如何将 QQuickItem 的位置映射到其新的父 QQuickItem 中?

4

1 回答 1

1

Items 位置始终相对于其父级。并且父级的位置是相对于其父级的,依此类推。但是您始终可以获得相对或全局位置。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;
            }
        }
    }
}
于 2017-09-03T13:11:26.860 回答