use*_*416 6 javascript c++ qt qml
如何从鼠标区域获取鼠标的绝对位置?我需要它来显示弹出窗口的正确位置
Item {
Menu {
id: menu
MenuItem {
onTriggered: {
// Need Mouse absolute position
}
}
}
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: {
menu.popup()
}
}
Run Code Online (Sandbox Code Playgroud)
您可能已经找到了答案,但我会将我的解决方案放在这里供其他人寻找相同的东西。
下面的函数将找到鼠标区域的绝对位置。然后你可以相应地添加 mouseX 和 mouseY 来获取鼠标位置。
Item {
Menu {
id: menu
MenuItem {
onTriggered: {
var absolutePos = getAbsolutePosition(source);
// Need Mouse absolute position
}
}
}
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: {
menu.popup()
}
}
function getAbsolutePosition(node) {
var returnPos = {};
returnPos.x = 0;
returnPos.y = 0;
if(node !== undefined && node !== null) {
var parentValue = getAbsolutePosition(node.parent);
returnPos.x = parentValue.x + node.x;
returnPos.y = parentValue.y + node.y;
}
return returnPos;
}
}
Run Code Online (Sandbox Code Playgroud)
mapToItem
,mapFromItem
mapToGlobal
,mapFromGlobal
onClicked: {
var positionInPopup = mapToItem(popup, mouse.x, mouse.y)
}
Run Code Online (Sandbox Code Playgroud)
就像 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)
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于上面的例子,和...
MouseArea
很近root
Window
... 你会看见:
对于根:QPointF(10, 0)
对于窗口:QPointF(150, 100)
对于系统:QPointF(1230, 120)
Window
类型与Window
(QML 类型)相互转换时,您需要使用其contentItem
属性,因为 mapTo/From 仅适用于Item
s。