(如何)我可以访问qml元素到主窗口

时间:2017-01-02 20:29:43

标签: qml

我有一个qml元素,并希望将(自己的)工具提示元素显示为此元素正上方的新窗口。为此我需要绝对的屏幕位置来放置新窗口(AFAIK)。

我得到的常规方法是使用“mapToItem”来获取相对位置,但我无法进入“主窗口” - 因为有问题的元素位于“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 )

1 个答案:

答案 0 :(得分:0)

Window项目有contentItem,尤其是

  

[只读]​​ contentItem:Item

     

场景的隐形根项目。

因此,您可以引用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;
}