2

我必须设置 a 的 x,y 坐标QWindow。这必须在我的+QWindow中获取 a 的屏幕坐标。QuickControlMainWindowmyValue

如何获取QuickControlQML 中的全局屏幕坐标?

4

3 回答 3

4

正如@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。要获得控件相对于屏幕本身的位置,我们只需添加窗口的xy位置。


在与 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"
        }
    }
}
于 2015-09-08T07:50:37.963 回答
1

因为xy坐标相对于所有项目的父项,但最上面的项目(aka Window),您至少可以通过遍历父链到 main 来获得它们Window,这些变量表示相对于 的位置Screen

在通过父链的过程中,这是一个加减法的问题,确实很烦人,但我不知道是否存在另一种解决方案。

于 2015-09-08T06:46:35.153 回答
0

对象 mapFromGlobal(real x, real y)

将全局坐标系中的点 (x, y) 映射到项目的坐标系,并返回与映射坐标匹配的点。这种 QML 方法是在 Qt 5.7 中引入的。

于 2017-07-12T10:02:49.227 回答