0

我有以下QML Rectangle具有父项的内容。需要注意的最重要的事情是它应用了一个Translate QML 元素,我正在努力理解它究竟对 QML 项及其应用的子项做了什么。

代码:

Window {
    id: main_window
    width: 640
    height: 480
    visible: true

    Item {
        id: rect_parent
        objectName: "rect_parent_object"
        x: 0
        y: 0
        width: parent.width
        height: parent.height
        transform: Translate {x: -20; y: -30}

        Rectangle {
            id: rect
            objectName: "rect_object"
            x: parent.width/2
            y: parent.height/2
            width: parent.width/3
            height: parent.height/3
            color: "red"
        }
    }
}

rect_parenttransform: Translate如您在上面的代码中所见,有一个属性。以下是应用于它的 XY 平移

transform: Translate {x: -20; y: -20}

在我的代码的 C++ 部分中,我通过以下方式main.cpp获取QQuickItems 。

QQuickItem *rectQuickItem = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectObject");
QQuickItem *rectQuickItemParent = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectParentObject");

是的,我可以通过以下方式获得xand yrectQuickItem

QQuickItem *rectQuickItemParent = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectParentObject");
qreal item_x = rectQuickItem->x();
qreal item_y = rectQuickItem->y();

问题:
但是我如何得到rectQuickItem翻译的 x 和 y?
我发现这并不是 UI 上实际应用的 x 和 y item_xitem_y这似乎transform: Translate是向 x 和 y 添加了一些rect我在查询时没有得到的单位rectQuickItem->x()

用更简单的话来说,我需要-20and-30应用于 x 和 ytransform: Translate块中rect_parent,最终适用于rect

目标:
我正在更改父rectQuickItem以将其显示在另一个窗口上,其 x 和 y 位置与原始父级相同。我需要添加到属性的单位xy属性,rectQuickItem以便在视觉上与前一个父级相同的位置transform: Translate显示。rect

附加问题:
QQuickItem ::MapToItem会以任何方式帮助我吗?

4

1 回答 1

1

如果你想获得一个项目相对于另一个项目的坐标,过程是:

  • 将项目的位置转换为相对于场景的位置
  • 将相对于场景的位置转换为相对于其他项目的位置。

static QPointF positionToAnotherItem(QQuickItem *source, QQuickItem *destine){
    QPointF p = source->mapToScene(QPointF(0, 0));
    return destine->mapFromScene(p);
}

static QPointF positionToParent(QQuickItem *item){
    return positionToAnotherItem(item, item->parentItem());
}

转换不会立即应用,因此通过应用上述过程,您将无法获得正确的位置,您必须在 xChanged 和 YChanged 信号的帮助下应用它们。

QQuickItem *rectQuickItem = qml_engine.rootObjects()[0]->findChild<QQuickItem*>("rect_object");
//QQuickItem *rectQuickItemParent = qml_engine.rootObjects()[0]->findChild<QQuickItem*>("rect_parent_object");

QObject::connect(rectQuickItem, &QQuickItem::xChanged, [rectQuickItem]{
    qDebug()<<positionToParent(rectQuickItem);
});

QObject::connect(rectQuickItem, &QQuickItem::yChanged, [rectQuickItem]{
    qDebug()<<positionToParent(rectQuickItem);
});

在下面的链接中有一个完整的例子

于 2018-02-27T22:53:22.020 回答