Получить экранные координаты 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.