简短的回答
onClicked: {
var positionInPopup = mapToItem(popup, mouse.x, mouse.y)
}
更长的答案
正如 indalive 所暗示的,映射坐标的首选方法是使用mapToItem
, 可用于任何项目。它将坐标(和大小)从当前项目坐标系统(如果没有另外指定)转换到另一个项目坐标系统。而mapFromItem
对方自然而然地反其道而行之。
从 Qt 5.7 开始,您还拥有mapToGlobal
,它将在系统/屏幕引用中为您提供坐标。
MouseArea {
// ...
onPositionChanged: {
var positionInRoot = mapToItem(root, mouse.x, mouse.y)
var positionInWindow = mapToItem(window.contentItem, mouse.x, mouse.y)
var globalPosition = mapToGlobal(mouse.x, mouse.y)
console.log("For root: " + positionInRoot )
console.log("For window: " + positionInWindow)
console.log("For system: " + globalPosition)
}
}
鉴于上面的例子,和......
- 你的离你的左上角
MouseArea
很近root
,稍微远一点Window
- 窗口本身距屏幕最左侧 1000 像素以上
... 你会看见:
对于根:QPointF(10, 0)
对于窗口:QPointF(150, 100)
对于系统:QPointF(1230, 120)
警告Window
类型
当转换为Window
(QML 类型)时,您需要使用它的contentItem
属性,因为 mapTo/From 仅适用于Item
s。