如何用QML获取屏幕全局鼠标位置而非应用内位置?
解决QML获取真实全局鼠标位置的问题
你的代码里用mainMouseArea.mouseX/mouseY拿到的是当前窗口内的相对坐标,即便窗口全屏,一旦系统开启高DPI缩放(比如125%、150%),QML的逻辑坐标就会和真实屏幕像素坐标不匹配。要获取全局真实鼠标位置,有两个可靠方案:
方案一:直接获取系统全局鼠标坐标
使用Qt.input.mouseX和Qt.input.mouseY,这两个属性直接返回系统层面的全局鼠标位置,不受窗口和DPI缩放影响,是最简便的方法。修改后的代码如下:
Window { id: root color: transparentColor visibility: ApplicationWindow.FullScreen flags: Qt.FramelessWindowHint MouseArea { id: mainMouseArea anchors.fill: parent hoverEnabled: true onPositionChanged: { mouseCoordinatesText.x = Qt.input.mouseX + 10; mouseCoordinatesText.y = Qt.input.mouseY + 10; } } Text { id: mouseCoordinatesText text: "Mouse Coordinates: (" + Math.floor(Qt.input.mouseX) + ", " + Math.floor(Qt.input.mouseY) + ")" color: "white" visible: true } }
方案二:修正DPI缩放带来的坐标偏差
如果你坚持使用窗口内的鼠标坐标,需要乘以当前屏幕的设备像素比(Screen.devicePixelRatio),把QML逻辑坐标转换成真实屏幕像素坐标:
Text { id: mouseCoordinatesText text: "Mouse Coordinates: (" + Math.floor(mainMouseArea.mouseX * Screen.devicePixelRatio) + ", " + Math.floor(mainMouseArea.mouseY * Screen.devicePixelRatio) + ")" color: "white" visible: true }
这个方案仅适用于窗口完全覆盖目标屏幕的场景,通用性不如方案一。
内容的提问来源于stack exchange,提问作者Jun long Liu
相关产品推荐
相关产品推荐

