2017-01-02 39 views
1

qml要素があり、この要素のすぐ上に新しいウィンドウとして(独自の)ツールチップ要素を表示する必要があります。このためには、新しいウィンドウ(AFAIK)を配置する絶対的なスクリーン位置が必要です。qml要素の相対位置をメインウィンドウにアクセスするには

通常の方法では "mapToItem"を使用して相対位置を取得していますが、 "メインウィンドウ"には到達できません。問題の要素は "Loader"内にありますこのケースはもう一度別のローダに配置されます)。

私の質問は、ダイナミックにロードされたコンポーネントの中からmainWindowにアクセスすることは可能ですか、それとも、要素のすぐ上に新しい(ツールチップ)ウィンドウをアンカーする簡単な方法がありますか?

EDIT

mapToGlobalはおそらくあまりにも動作しますが、私はQT 5.6を使用する必要があります。 私は最終的には、C++でのコンテキストプロパティとしてメインウィンドウを設定することで動作するようになった:

this-> qmlEngine-> rootContext() - > setContextProperty( "メインウィンドウ"、this->ルート)。

とQMLでiは、その後(画面上の)メインウィンドウの位置にアクセスすることができ、そのような図示ウィンドウにアイテムが持つ相対的な位置を追加します。

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だったかのように、あなたはWindow.contentItemを参照することができます。

私として
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; 
} 
関連する問題