Получить экранные координаты QuickControl

Я должен установить координаты x, y QWindow. Этот QWindow должен получить экранные координаты QuickControl в моем MainWindow + myValue.

Как получить глобальные координаты экрана для QuickControl в QML?


person RefMa77    schedule 08.09.2015    source источник


Ответы (3)


Как уже упоминалось @BaCaRoZzo, используйте функции mapToItem()/mapFromItem():

import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.0

Window {
    id: window
    width: 400
    height: 400
    visible: true

    Button {
        id: button
        text: "Button"
        x: 100
        y: 100

        readonly property point windowPos: button.mapToItem(null, 0, 0)
        readonly property point globalPos: Qt.point(windowPos.x + window.x, windowPos.y + window.y)
    }

    Column {
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.bottom: parent.bottom

        Text {
            text: "Button position relative to window: x=" + button.windowPos.x + " y=" + button.windowPos.y
        }

        Text {
            text: "Button position relative to screen: x=" + button.globalPos.x + " y=" + button.globalPos.y
        }
    }
}

Как указано в документации для mapToItem():

Сопоставляет точку (x, y) или прямоугольник (x, y, ширина, высота), который находится в системе координат этого элемента, с системой координат элемента и возвращает точку или прямоугольник, соответствующие сопоставленным координатам.

Если элемент имеет нулевое значение, это сопоставляет точку или прямоугольник с системой координат корневого представления QML.

Это дает нам windowPos. Чтобы получить положение элемента управления относительно самого экрана, мы просто добавляем x и y позиции окна.


После разговора с OP становится ясно, что он хочет сделать это на C++. Применяются те же принципы, и в C++ у нас более удобный доступ к окну:

class Control : public QQuickItem
{
    Q_OBJECT
public:
    Control() {}
    ~Control() {}

public slots:
    void printGlobalPos() {
        qDebug() << mapToItem(Q_NULLPTR, QPointF(0, 0)) + window()->position();
    }
};

Зарегистрируйте тип:

qmlRegisterType<Control>("Types", 1, 0, "Control");

Используйте его в QML:

import QtQuick 2.0
import QtQuick.Window 2.0

import Types 1.0

Window {
    id: window
    width: 400
    height: 400
    visible: true

    Control {
        id: button
        x: 100
        y: 100
        width: 100
        height: 40

        MouseArea {
            anchors.fill: parent
            onClicked: button.printGlobalPos()
        }

        Rectangle {
            anchors.fill: parent
            color: "transparent"
            border.color: "darkorange"
        }
    }
}
person Mitch    schedule 08.09.2015
comment
Спасибо, теперь я могу прочитать относительные координаты x, y в главном окне. Для глобальных координат я пытался добавить Window.x и Window.y, но это не сработало, не могли бы вы дать мне совет? - person RefMa77; 09.09.2015
comment
Запустите приведенный мной пример и перетащите окно — глобальные координаты обновятся. Вы пробовали это? - person Mitch; 09.09.2015
comment
Этот QuickControl должен быть универсальным, поэтому я не могу использовать какие-либо идентификаторы, не так ли? - person RefMa77; 09.09.2015
comment
Извините, я вас не понимаю. О каком контроле вы говорите? - person Mitch; 09.09.2015
comment
Прошу прощения за нечеткое описание, теперь мне нужна глобальная позиция QComboBox. Я могу получить координаты x, y относительно корневого элемента с помощью mapToItem(null,0,0). Если я правильно вас понял, мне нужно добавить глобальные координаты x,y корневого элемента, но как мне это сделать? - person RefMa77; 09.09.2015
comment
Какой у вас корневой элемент? Если это не Window или ApplicationWindow, вам нужно будет найти окно и добавить его позиции x и y, чтобы получить глобальную позицию. - person Mitch; 09.09.2015
comment
Давайте продолжим это обсуждение в чате. - person RefMa77; 09.09.2015

Поскольку координаты x и y относятся к родителю для всех элементов, кроме верхних (он же Window), вы можете получить их, по крайней мере, пройдя по родительской цепочке к основному Window, для которого эти переменные указывают положение относительно Screen.

Это вопрос сложений и вычитаний во время путешествия по родительской цепочке, что действительно очень раздражает, но я не знаю, существует ли другое решение.

person skypjack    schedule 08.09.2015
comment
Для внутренних Item есть функции mapToItem/mapFromItem. Screen должен предоставлять некоторую вспомогательную функцию для контейнеров верхнего уровня. - person BaCaRoZzo; 08.09.2015
comment
Это имеет смысл. :-) ... Мне кажется, что вы можете использовать mapToItem для замыкания родительской цепочки, но вам все равно нужно получить смещение к Screen, когда у вас есть относительное положение элемента, для mapToItem сопоставляется с самым верхним (например, ApplicationWindow). Я ошибаюсь? - person skypjack; 08.09.2015

карта объектаFromGlobal (реальный x, реальный y)

Сопоставляет точку (x, y), которая находится в глобальной системе координат, с системой координат элемента и возвращает точку, соответствующую сопоставленной координате. Этот метод QML был введен в Qt 5.7.

person Calcifer Lorain    schedule 12.07.2017