2013-10-15 47 views
4

如何從鼠標區域獲取絕對鼠標位置? 我需要它顯示一個彈出一個正確的位置QML鼠標MouseArea中的絕對位置

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

回答

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; 
    } 
} 
+0

這是一個簡單的解決方案,當你只有1級時,但是mapToItem作爲更靈活和更容易維護的首選,因爲解釋是indalive和我的以下答案https://stackoverflow.com/a/44779025/4223664 –

0

如果選中的文檔,您將得到一個名爲鼠標的MouseEvent PARAM在鼠標區域(http://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick2-mousearea.html#onClicked-signal)的onClicked信號。使用MouseEvent對象(http://qt-project.org/doc/qt-5.0/qtquick/qml-qtquick2-mouseevent.html),您可以用

mouse.x 
mouse.y 
+1

Thx,但它不是絕對座標。 – user14416

+1

它在鼠標區域的容器內是相對的。既然你絕對不應該定位元素,我不會看到它會有什麼幫助。 – Deadron

+0

@Deadron彈出一個鼠標點擊的窗口 – povman

2

訪問的onClick處理程序內的鼠標位置在這種情況下鼠標區域罷了,他的父母(anchors.fill:父),因此mouseArea.mouseX和mouseArea.mouseY是絕對的鼠標位置。對於相對位置,你應該使用mapFromItem和mapToItem函數http://doc.qt.io/qt-5/qml-qtquick-item.html#mapToItem-method

+0

太棒了!新鏈接是[here](http://doc.qt.io/qt-5/qml-qtquick-item.html#mapFromItem-method-1) –

1

贊同暗示,映射座標的首選方法是使用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)

的最左邊

對於根:QPointF(10,0)

對於窗口:QPointF(150,100)

對於系統:QPointF(1230,120)

需要注意的是,當你想轉換爲Window(QML型)座標系統,你需要使用contentItem方法,如mapTo /從僅適用於Item秒。