Я должен установить координаты x, y QWindow
. Этот QWindow
должен получить экранные координаты QuickControl
в моем MainWindow
+ myValue
.
Как получить глобальные координаты экрана для QuickControl
в QML?
Я должен установить координаты x, y QWindow
. Этот QWindow
должен получить экранные координаты QuickControl
в моем MainWindow
+ myValue
.
Как получить глобальные координаты экрана для QuickControl
в QML?
Как уже упоминалось @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"
}
}
}
mapToItem(null,0,0)
. Если я правильно вас понял, мне нужно добавить глобальные координаты x,y корневого элемента, но как мне это сделать?
- person RefMa77; 09.09.2015
Window
или ApplicationWindow
, вам нужно будет найти окно и добавить его позиции x
и y
, чтобы получить глобальную позицию.
- person Mitch; 09.09.2015
Поскольку координаты x
и y
относятся к родителю для всех элементов, кроме верхних (он же Window
), вы можете получить их, по крайней мере, пройдя по родительской цепочке к основному Window
, для которого эти переменные указывают положение относительно Screen
.
Это вопрос сложений и вычитаний во время путешествия по родительской цепочке, что действительно очень раздражает, но я не знаю, существует ли другое решение.
Item
есть функции mapToItem
/mapFromItem
. Screen
должен предоставлять некоторую вспомогательную функцию для контейнеров верхнего уровня.
- person BaCaRoZzo; 08.09.2015
mapToItem
для замыкания родительской цепочки, но вам все равно нужно получить смещение к Screen
, когда у вас есть относительное положение элемента, для mapToItem
сопоставляется с самым верхним (например, ApplicationWindow
). Я ошибаюсь?
- person skypjack; 08.09.2015
карта объектаFromGlobal (реальный x, реальный y)
Сопоставляет точку (x, y), которая находится в глобальной системе координат, с системой координат элемента и возвращает точку, соответствующую сопоставленной координате. Этот метод QML был введен в Qt 5.7.