【问题标题】:QML mouse absolute position in MouseAreaMouseArea中的QML鼠标绝对位置
【发布时间】:2013-10-15 22:27:22
【问题描述】:

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

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

【问题讨论】:

    标签: javascript c++ qt qml


    【解决方案1】:

    简答

        onClicked: {
            var positionInPopup = mapToItem(popup, mouse.x, mouse.y)
        }
    

    更长的答案

    正如 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 像素以上

    ...你会看到:

    对于根:QPointF(10, 0)

    对于窗口:QPointF(150, 100)

    对于系统:QPointF(1230, 120)

    注意Window 类型

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      【解决方案3】:

      在这种情况下 mouseArea 填充他的父级(anchors.fill: parent),因此 mouseArea.mouseX 和 mouseArea.mouseY 是绝对鼠标位置。对于相对位置,您应该使用 mapFromItem 和 mapToItem 函数http://doc.qt.io/qt-5/qml-qtquick-item.html#mapToItem-method

      【讨论】:

      • 太棒了!新链接是here
      【解决方案4】:

      如果您查看 Mouse Area(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
      

      【讨论】:

      • 谢谢,但不是绝对坐标。
      • 在鼠标区域的容器内是相对的。因为无论如何你都不应该绝对定位元素,所以我看不出它会有什么帮助。
      • @Deadron 弹出鼠标点击的窗口
      猜你喜欢
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 2013-08-10
      • 1970-01-01
      相关资源
      最近更新 更多