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



我有以下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.cppC++代码的一部分中,我通过以下方式获得QQuickItem

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->x()

我没有得到这些单位。简而言之,我需要在最终应用于rectrect_parent块中的 x 和 ytransform: Translate和 y 上的-20-30

目的:
我正在更改rectQuickItem的父级,以将其显示在另一个窗口中,该窗口具有与原始父级相同的相应x和y位置。我需要添加到x的单位,并且由于设置了transform: TranslateyrectQuickItem的属性,以便在视觉上显示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);
});

在下面的链接中有一个完整的示例

相关内容

  • 没有找到相关文章

最新更新