如何将 X 和 Y 转换值应用于 C++ 端的 QQuickItem

Posted

技术标签:

【中文标题】如何将 X 和 Y 转换值应用于 C++ 端的 QQuickItem【英文标题】:How to get the X and Y translated values applied to a QQuickItem on to the C++ side 【发布时间】:2018-02-27 21:46:57 【问题描述】:

我有以下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

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

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

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

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

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

简而言之,我需要将-20-30 应用于rect_parenttransform: Translate 块中的x 和y,最终应用于rect

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

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

【问题讨论】:

相对于哪个Item他需要获取rect_object的坐标?相对于窗口、相对于屏幕、相对于父项? 我需要它相对于父项 rect_parent。关于这一点,有没有一种方法可以让我获得相对于窗口的坐标(main_window)? rect_parentrect 的直接父级。如果你看到示例代码,你就会明白我的意思。我指的是 QQuickItems 在 QML 上的 ID。 @eyllanesc 我是否提供了您正在寻找的信息?关于transform: Translate 块的作用,我的知识非常基础。因此我的问题也可能有点偏离:-) 如果您从 C++ 进入 QML,那么您已经陷入了糟糕的软件设计实践。 【参考方案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有一个完整的例子

【讨论】:

只是为了让你知道,当我在新窗口/QQuickItem 上绘制它时,我正在做一个rectQuickItem-&gt;setParentItem(new_parent_window)。但不管您的回答如何,都解释了一种从一个父级获取 QPointF 并映射到另一个父级的方法。看来这是我需要做的 让我正确理解并尝试一下。

以上是关于如何将 X 和 Y 转换值应用于 C++ 端的 QQuickItem的主要内容,如果未能解决你的问题,请参考以下文章

如何使用内部函数 C++ 将 3 个加法和 1 个乘法转换为矢量化 SIMD

将两个整数x和y有效地转换为浮点数x.y

将 x,y 像素值转换为 lat 和 long

(C++)除基取余法:将十进制数转化为Q进制数

C++ 将指针转换为指针 (x**) -> (y**)

如何将英尺坐标(x,y)转换为像素