如何将应用于QQuickItem的X和Y翻译值应用到C ++端

时间:2018-02-27 21:46:57

标签: qt qml qtquick2 qqmlcomponent qqmllistproperty

我有以下QML Rectangle,其中包含父项。最值得注意的是,它应用了Translate QML element,我正在努力理解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_parent有一个属性transform: Translate。以下是适用于它的X Y翻译

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

在{+ 1}}中的C ++部分代码中,我按以下方式获取main.cpp

QQuickItem

是的,我可以通过以下方式获取QQuickItem *rectQuickItem = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectObject"); QQuickItem *rectQuickItemParent = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectParentObject"); 的{​​{1}}和x

y

问题:
但是如何将rectQuickItem翻译成x和y? 我发现QQuickItem *rectQuickItemParent = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectParentObject"); qreal item_x = rectQuickItem->x(); qreal item_y = rectQuickItem->y(); rectQuickItem不是实际应用于UI的x和y。似乎item_x正在向item_y的x和y添加一些单位,当我查询transform: Translate时,我无法获得这些单位。

简单来说,,我需要在rect rectQuickItem->x()块中的x和y上应用-20-30,最终适用于transform: Translate

目的:
我正在更改rect_parent的父以将其显示在另一个窗口上,该窗口具有与原始父级相同的x和y位置。由于设置了rect,我需要添加rectQuickItemx属性y的单位,以便在视觉上相同的位置显示rectQuickItem作为以前的父母。

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

1 个答案:

答案 0 :(得分: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);
});

在以下link中有一个完整的示例