Как получить переведенные значения X и Y, примененные к QQuickItem на стороне C++
У меня есть следующее QML Rectangle
у которого есть родительский элемент. Самая важная вещь, на которую следует обратить внимание, это то, что она применяет элемент Translate 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}
В C++ часть моего кода в main.cpp
Я получаю QQuickItem
S следующим образом.
QQuickItem *rectQuickItem = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectObject");
QQuickItem *rectQuickItemParent = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectParentObject");
Да, я могу получить x
а также y
из rectQuickItem
следующим образом.
QQuickItem *rectQuickItemParent = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("rectParentObject");
qreal item_x = rectQuickItem->x();
qreal item_y = rectQuickItem->y();
Вопрос:
Но как я могу получить rectQuickItem
переводится х и у?
я нашел это item_x
а также item_y
не х и у, которые на самом деле применяются в пользовательском интерфейсе. Кажется, что transform: Translate
добавляет некоторые единицы к х и у rect
который я не получаю при запросе rectQuickItem->x()
,
Проще говоря, мне нужно -20
а также -30
применяется на х и у в transform: Translate
блок из rect_parent
что в конечном итоге относится к rect
Задача:
Я меняю родителя rectQuickItem
чтобы отобразить его в другом окне с тем же соответствующим расположением x и y, что и у исходного родителя. Мне нужны единицы, которые были добавлены в x
а также y
свойств rectQuickItem
из-за transform: Translate
устанавливается так, чтобы отображать rect
визуально в том же месте, что и предыдущий родитель.
Дополнительный вопрос:
Может ли QQuickItem::MapToItem помочь мне здесь?
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);
});
По следующей ссылке есть полный пример