組件

2014-01-30 58 views
4
的QML屏幕座標

如果我有一個簡單,獨立的QML應用程序,我可以說組件

Component.onCompeted: {  
    var l = myThing.mapToItem(null, 0, 0) 
    console.log("X: " + l.x + " y: " + l.y) 
} 

其中myThing是任何其他組件的ID在得到一個組件的絕對屏幕座標文件。但是,如果這個文件被合併到另一個QML文件中,並且它定義的組件被重用,我不再獲得屏幕座標;我得到相對於執行上述語句的組件的本地座標。

如何獲取項目的絕對屏幕座標?

回答

5
Component.onCompleted: { 
    var globalCoordinares = myThing.mapToItem(myThing.parent, 0, 0) 
    console.log("X: " + globalCoordinares.x + " y: " + globalCoordinares.y) 
} 

其中myThing.parent是你的主要compontent。

+1

不幸的是,我無法訪問將使用此小部件的主要組件。 –

+0

你說得對。我用'myThing.parent'對其進行了測試,以防父QML元素填充整個窗口。如果這是你的根元素,你也可以使用'myThing.parent.parent'。不是很好,可維護,但它的工作原理。 –

+0

@PaulCarlisle,有一種方法可以使用'import'來訪問不同的QML。 'import「../Path/To/Parent/」as ParentOfMyThing' 然後,應該可以使用以下的東西:'ParentOfMyThing.someId' –

1

這是一個快速而非常髒的解決方案。注意:這只是輕微測試,但迄今似乎工作。我不建議在生產應用程序中使用它,因爲它是一種完全的黑客攻擊,並可能在某些時候中斷。

ApplicationWindow { 
    id: mainWindow 
    visible: true 
    width: 640 
    height: 480 
    x: 150.0 
    y: 150.0 
    title: qsTr("Hello World") 

    Rectangle { 
     id: lolRect 
     height: 50 
     width: 50 
     anchors.centerIn: parent; 

     Component.onCompleted: { 

      function getGlobalCordinatesOfItem(item) { 

       // Find the root QML Window. 
       function getRootWindowForItem(item) { 
        var cItem = item.parent; 
        if (cItem) { 
         return getRootWindowForItem(cItem); 
        } else { 

         // Path to the root items ApplicationWindow 
         var rootWindow = item.data[0].target; 
         if (rootWindow && rootWindow.toString().indexOf("ApplicationWindow") !== -1) { 
          return rootWindow; 
         } else { 
          console.exception("Unable to find root window!"); 
          return null; 
         } 
        } 
       } 

       // Calculate the items position. 
       var rootWindow = getRootWindowForItem(item); 
       if (rootWindow) { 
        return Qt.point(rootWindow.x + lolRect.x, 
            rootWindow.y + lolRect.y); 
       } else { 
        return null; 
       } 
      } 

      // Print the result. 
      console.log(getGlobalCordinatesOfItem(this)); 
     } 
    } 
}