Qt/QML 问题。使用 Qt 5.7。
采用以下简单的 QML 程序,该程序显示垂直对齐的红色矩形和蓝色矩形。两个矩形的单击处理程序都尝试更改父宿主窗口的颜色。但有细微的差别。红色矩形通过 id 直接引用主窗口(根窗口)。蓝色点击处理程序通过parent参考。
前一种情况效果很好。后一种情况不起作用。似乎根窗口被特殊对待,并且不是父/子层次结构的直接一部分,即使矩形在逻辑上以这种方式嵌套在代码中。
有人可以解释一下这方面的规则吗?
import QtQuick 2.7
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
id: rootWindow
color: "#ffffee"
Rectangle {
id: rect1; width: 50; height: 50; color:"red"
MouseArea {
anchors.fill: parent;
onClicked: {
print("rect1 clicked");
rootWindow.color = "green"; // works fine
}
}
}
Rectangle {
id: rect2; width: 50; height: 50; color:"blue"
anchors.top: rect1.bottom
MouseArea {
anchors.fill: parent;
onClicked: {
print("rect2 clicked");
rect2.parent.color = "pink"; // does not work
}
}
}
}
如果将以下行添加到onClicked
处理程序,你会看到它的父级不是Window
:
print(rect2.parent)
Output:
qml: QQuickRootItem(0x18b18147bc0)
这在的文档Window http://doc.qt.io/qt-5/qml-qtquick-window-window.html#data-prop:
如果将一个 Item 分配给数据列表,它将成为 Window 的 contentItem 的子项,以便它出现在窗口内。该项目的父级将是窗口的 contentItem,它是该窗口内项目所有权树的根。
窗口本身不是一个项目,所以它使用contentItem http://doc.qt.io/qt-5/qml-qtquick-window-window.html#contentItem-prop相反,子项目可以有一个父项目。
然而,在 Qt 5.7 中,Window
got an 附属财产 http://doc.qt.io/qt-5/qml-qtquick-window-window.html#window-attached-prop可用于访问项目的窗口:
rect2.Window.window.color = "pink";
无论哪个项目出现在Window.window
部分将是使用附加属性的项目。您可以在该场景中的任何项目上使用它(例如MouseArea
),因为它们都属于同一个窗口。
请注意,附加属性创建一个QObject
- 派生对象用于它们所使用的每个唯一项目,因此请注意如何使用它们,尤其是在大量创建的项目中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)