Javascript QML鼠标在鼠标中的绝对位置a
如何从鼠标区域获取鼠标的绝对位置? 我需要有它来显示一个正确位置的弹出窗口Javascript QML鼠标在鼠标中的绝对位置a,javascript,c++,qt,qml,Javascript,C++,Qt,Qml,如何从鼠标区域获取鼠标的绝对位置? 我需要有它来显示一个正确位置的弹出窗口 Item { Menu { id: menu MenuItem { onTriggered: { // Need Mouse absolute position } } } MouseArea { id: mouseArea anchors.
Item {
Menu {
id: menu
MenuItem {
onTriggered: {
// Need Mouse absolute position
}
}
}
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: {
menu.popup()
}
}
如果您在Mouse Area()中查看文档中的onClicked信号,就会得到一个名为Mouse的MouseEvent参数。使用MouseEvent object()可以使用
mouse.x
mouse.y
在本例中,mouseArea填充其父对象(anchors.fill:parent),因此mouseArea.mouseX和mouseArea.mouseY是鼠标的绝对位置。对于相对位置,您应该使用mapFromItem和mapToItem函数您可能已经找到了答案,但我将把我的解决方案放在这里,以供其他人使用 下面的函数将查找鼠标区域的绝对位置。 然后,您可以相应地添加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;
}
}
简短回答
- 映射到/来自另一项:
- 映射到/从全局(从Qt 5.7开始):
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
窗口的左上角稍远一点
- 窗口本身距离屏幕最左侧1000px+
窗口的警告
类型
在转换为
窗口(QML类型)时,需要使用其contentItem
属性,因为mapTo/from仅适用于项目Thx,但它不是绝对坐标。它在鼠标区域的容器内是相对的。因为你无论如何都不应该绝对地定位元素,所以我看不出这会有什么帮助。@Deadron弹出一个窗口,在那里鼠标被点击了!新的链接是这是一个简单的解决方案,当你只有一个级别,但mapToItem更灵活,更容易维护,这是首选,解释是indalive和我下面的答案
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)
}
}