我有以下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
,我需要添加rectQuickItem
和x
属性y
的单位,以便在视觉上相同的位置显示rectQuickItem
作为以前的父母。
其他问题:
QQuickItem::MapToItem会以任何方式帮助我吗?
答案 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中有一个完整的示例