我必须设置 a 的 x,y 坐标QWindow
。这必须在我的+QWindow
中获取 a 的屏幕坐标。QuickControl
MainWindow
myValue
如何获取QuickControl
QML 中的全局屏幕坐标?
我必须设置 a 的 x,y 坐标QWindow
。这必须在我的+QWindow
中获取 a 的屏幕坐标。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, 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
坐标相对于所有项目的父项,但最上面的项目(aka Window
),您至少可以通过遍历父链到 main 来获得它们Window
,这些变量表示相对于 的位置Screen
。
在通过父链的过程中,这是一个加减法的问题,确实很烦人,但我不知道是否存在另一种解决方案。
对象 mapFromGlobal(real x, real y)
将全局坐标系中的点 (x, y) 映射到项目的坐标系,并返回与映射坐标匹配的点。这种 QML 方法是在 Qt 5.7 中引入的。