如何将 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++ 部分中,我通过以下方式获得QQuickItem
s。
QQuickItem *rectQuickItem = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectObject");
QQuickItem *rectQuickItemParent = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectParentObject");
是的,我可以通过以下方式获得rectQuickItem
的x
和y
。
QQuickItem *rectQuickItemParent = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectParentObject");
qreal item_x = rectQuickItem->x();
qreal item_y = rectQuickItem->y();
问题:
但是我如何获得 rectQuickItem
的翻译 x 和 y?
我发现item_x
和item_y
并不是UI上实际应用的x和y。似乎transform: Translate
正在向rect
的 x 和 y 添加一些单位,当我查询rectQuickItem->x()
时我没有得到。
简而言之,我需要将-20
和-30
应用于rect_parent
的transform: Translate
块中的x 和y,最终应用于rect
目标:我正在更改 rectQuickItem
的父级,以将其显示在与原始父级具有相同 x 和 y 位置的另一个窗口上。我需要添加到rectQuickItem
属性的x
和y
的单元,因为transform: Translate
被设置为在视觉上与前一个父级相同的位置显示rect
。
其他问题:QQuickItem::MapToItem 会在这里以任何方式帮助我吗?
【问题讨论】:
相对于哪个Item他需要获取rect_object的坐标?相对于窗口、相对于屏幕、相对于父项? 我需要它相对于父项rect_parent
。关于这一点,有没有一种方法可以让我获得相对于窗口的坐标(main_window
)?
rect_parent
是rect
的直接父级。如果你看到示例代码,你就会明白我的意思。我指的是 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->setParentItem(new_parent_window)
。但不管您的回答如何,都解释了一种从一个父级获取 QPointF 并映射到另一个父级的方法。看来这是我需要做的
让我正确理解并尝试一下。以上是关于如何将 X 和 Y 转换值应用于 C++ 端的 QQuickItem的主要内容,如果未能解决你的问题,请参考以下文章