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开始):
更长的答案 与indalive暗示的一样,映射坐标的首选方法是使用,可用于任何项目。它将坐标(和大小)从当前项目坐标系(如果未另行指定)转换为另一个项目坐标系。而对方自然会做相反的事情

在Qt5.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+
。。。你会看到:

对于根:QPointF(10,0)

窗口:QPointF(150100)

对于系统:QPointF(12301220)

带有
窗口的警告
类型
在转换为
窗口(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)
    }
}