如何从鼠标区域获取绝对鼠标位置? 我需要让它显示弹出一个正确的位置
Item {
Menu {
id: menu
MenuItem {
onTriggered: {
// Need Mouse absolute position
}
}
}
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: {
menu.popup()
}
}
答案 0 :(得分:4)
你可能已经找到了答案,但我会把我的解决方案放在其他地方寻找同样的事情。
以下功能将找到鼠标区域的绝对位置。 然后你可以相应地添加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;
}
}
答案 1 :(得分:3)
在这种情况下,mouseArea填充其父级(anchors.fill:parent),因此mouseArea.mouseX和mouseArea.mouseY是绝对鼠标位置。对于相对位置,您应该使用mapFromItem和mapToItem函数http://doc.qt.io/qt-5/qml-qtquick-item.html#mapToItem-method
答案 2 :(得分:1)
与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像素+ (S)
对于root:QPointF(10,0)
对于窗口:QPointF(150,100)
对于系统:QPointF(1230,120)
请注意,当您要转换为Window
(QML类型)坐标系时,您需要使用contentItem
方法,因为mapTo / From仅适用于Item
s
答案 3 :(得分:0)
如果检查鼠标区域(http://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick2-mousearea.html#onClicked-signal)中onClicked信号的文档,则会给出一个名为mouse的MouseEvent参数。使用MouseEvent对象(http://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick2-mouseevent.html),您可以使用
访问onClick处理程序内的鼠标位置mouse.x
mouse.y