Как получить переведенные значения 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 Я получаю QQuickItemS следующим образом.

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);
});

По следующей ссылке есть полный пример

Другие вопросы по тегам