我有以下QML Rectangle
,其中包含父项。要注意的最重要的事情是它应用了一个翻译 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_parent
有一个属性transform: Translate
如上面的代码所示。以下是应用于它的 X Y 翻译
transform: Translate {x: -20; y: -20}
在main.cpp
C++代码的一部分中,我通过以下方式获得QQuickItem
。
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()
时
我没有得到这些单位。简而言之,我需要在最终应用于rect
rect_parent
块中的 x 和 ytransform: Translate
和 y 上的-20
和-30
目的:
我正在更改rectQuickItem
的父级,以将其显示在另一个窗口中,该窗口具有与原始父级相同的相应x和y位置。我需要添加到x
的单位,并且由于设置了transform: Translate
而y
rectQuickItem
的属性,以便在视觉上显示rect
与以前的父级相同的位置。
附加问题:
QQuickItem::MapToItem 会在这里以任何方式帮助我吗?
如果要获取一个项目相对于另一个项目的坐标,过程为:
- 将项目的位置转换为相对于场景的位置
- 将相对于场景的位置转换为位置 尊重其他项目。
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);
});
在下面的链接中有一个完整的示例