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

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

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

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, width, height), который находится в системе координат этого элемента, с системой координат элемента и возвращает точку или прямоугольник, соответствующие сопоставленной координате.

Если item является нулевым значением, это отображает точку или прямоугольник в систему координат корневого представления 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"
        }
    }
}

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

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

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

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

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