Как упоминалось @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"
}
}
}
Спасибо, теперь я могу прочитать релятивистские координаты x, y в главном окне. Для глобальных координаторов я попытался добавить Window.x & Window.но это не сработало, не могли бы вы дать мне совет? – RefMa77
Запустите пример, который я предоставил, и перетащите окно вокруг - глобальные координаты будут обновляться. Вы пробовали это? – Mitch
Этот QuickControl должен быть общим, поэтому я не могу использовать любые идентификаторы, не так ли? – RefMa77