2017-01-02 49 views
1

我有一个qml元素,并希望显示一个(自己的)工具提示元素作为这个元素上方的新窗口。为此,我需要绝对屏幕位置放置新窗口(AFAIK)。(How)我可以访问qml元素的相对位置到主窗口

到目前为止,我的常规方法是使用“mapToItem”来获取相对位置,但我无法进入“主窗口” - 因为问题中的元素位于“Loader”中这种情况又位于另一个Loader中)。

所以我的问题是:是否有可能从动态加载的组件内部访问mainWindow,或者是否有另一种更简单的方法将新的(工具提示)窗口锚定在元素上方?

编辑

mapToGlobal可能将工作太,但我使用Qt 5.6。我终于通过在C++中设置主窗口作为上下文属性来工作:

this-> qmlEngine-> rootContext() - > setContextProperty(“mainWindow”,this-> root);

和QML我可以然后访问主窗口位置(在屏幕上),并添加相对位置处的项目具有类似,所示的窗口:

tooltipWindow.setX(mainWindow.x +item1.mapToItem(item2,0,0).x) 
+0

你有一些代码可以玩吗?我认为主要的问题是,'Window'不能从'Item'继承,所以不应该有'mapToItem'或'mapFromItem'-方法可用。 – derM

+0

你真的打算为这个工具提示使用一个新的'Window',或者是在一个普通的'Window'内使用一个新的'Item'吗? – derM

+0

你打算把它作为* mainWindow *还是作为兄弟姐妹的孩子? – derM

回答

0

Window项具有contentItem特别是对于

[只读]​​ contentItem:项目

场景的不可见的根项目。

那么你可以参考Window.contentItem,如果它是Window

import QtQuick 2.7 
import QtQuick.Window 2.2 

Window { 
    id: mainWindow 
    visible: true 
    width: 600 
    height: 300 

    Component { 
     id: testElement 
     Rectangle { 
      id: rect 
      width: 100 
      height: 100 
      color: "orange" 
      border { width: 1; color: "#999" } 
      MouseArea { 
       anchors.fill: parent 
       hoverEnabled: true 
       onEntered: tooltip.show(true); 
       onExited: tooltip.show(false); 
       onPositionChanged: tooltip.setPosition(mapToItem(mainWindow.contentItem,mouse.x, mouse.y)); 
      } 
     } 
    } 

    Item { 
     x: 40 
     y: 50 
     Item { 
      x: 80 
      y: 60 
      Loader { 
       sourceComponent: testElement 
      } 
     } 
    } 

    Rectangle { 
     id: tooltip 
     visible: false 
     width: 100 
     height: 20 
     color: "lightgreen" 
     border { width: 1; color: "#999" } 
     Text { 
      anchors.centerIn: parent 
      text: "I'm here" 
     } 
     function show(isShow) { 
      tooltip.visible = isShow; 
     } 
     function setPosition(point) { 
      tooltip.x = point.x - tooltip.width/2; 
      tooltip.y = point.y - tooltip.height; 
     } 
    } 
} 

至于我,我会在MouseArea.onEntered重新设置父级工具提示项,悬停的项目本身,所以你能避免重新计算位置等:

onEntered: tooltip.show(true, rect); 
onExited: tooltip.show(false); 
onPositionChanged: tooltip.setPosition(mouse.x, mouse.y); 

...

function show(isShow, obj) { 
    obj = (typeof obj !== 'undefined' ? obj : null); 
    if(obj !== null) { 
     tooltip.parent = obj; 
    } 
    tooltip.visible = isShow; 
} 

function setPosition(x, y) { 
    tooltip.x = x - tooltip.width/2; 
    tooltip.y = y - tooltip.height; 
} 
相关问题