QML鼠标在MouseArea中的绝对位置

时间:2013-10-15 22:27:22

标签: javascript c++ qt qml

如何从鼠标区域获取绝对鼠标位置? 我需要让它显示弹出一个正确的位置

Item {
    Menu {
        id: menu
        MenuItem {
            onTriggered: {
               // Need Mouse absolute position
            }
        }
    }
    MouseArea {
        id: mouseArea
        anchors.fill: parent
        onClicked: {
            menu.popup()
        }
    }

4 个答案:

答案 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