2015-09-08 4 views

ответ

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

Как уже упоминалось в documentation для mapToItem():

Карты точка (х, у) или прямоугольника (х, y, width, height), которая находится в системе координат этого элемента, в систему координат элемента и возвращает точку или прямоугольник, соответствующие отображаемой координате.

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

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


После беседы с ОП ясно, что он хочет сделать это на 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" 
     } 
    } 
} 
+0

Спасибо, теперь я могу прочитать релятивистские координаты x, y в главном окне. Для глобальных координаторов я попытался добавить Window.x & Window.но это не сработало, не могли бы вы дать мне совет? – RefMa77

+0

Запустите пример, который я предоставил, и перетащите окно вокруг - глобальные координаты будут обновляться. Вы пробовали это? – Mitch

+0

Этот QuickControl должен быть общим, поэтому я не могу использовать любые идентификаторы, не так ли? – RefMa77

1

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

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

+2

Для внутренних 'элементов' есть функции 'mapToItem' /' mapFromItem'. «Экран» должен предоставлять некоторую вспомогательную функцию для контейнеров верхнего уровня. – BaCaRoZzo

+0

Это имеет смысл. :-) ... Мне кажется, что вы можете использовать «mapToItem», чтобы сократить родительскую цепочку, но вам все равно нужно получить смещение на «Экран», если у вас есть относительное положение элемента, для 'mapToItem' карты к самому верхнему (в качестве примера - «ApplicationWindow»). Я ошибаюсь? – skypjack

0

объект mapFromGlobal (real x, real y)

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

Смежные вопросы