我有一个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 )
答案 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;
}