QML鼠标在MouseArea中的绝对位置

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)

Bla*_*ngs 6

您可能已经找到了答案,但我会将我的解决方案放在这里供其他人寻找相同的东西。

下面的函数将找到鼠标区域的绝对位置。然后你可以相应地添加 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)


Adr*_*vat 5

简答

    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很近rootWindow
  • 窗口本身距离屏幕最左侧 1000px+

... 你会看见:

对于根:QPointF(10, 0)

对于窗口:QPointF(150, 100)

对于系统:QPointF(1230, 120)

警告Window类型

Window(QML 类型)相互转换时,您需要使用其contentItem属性,因为 mapTo/From 仅适用于Items。