Qt / QML问题。使用Qt 5.7。
采用以下简单的QML程序,该程序显示红色矩形和垂直对齐的蓝色矩形。两个矩形的单击处理程序尝试更改父主机窗口的颜色。但有一个微妙的区别。红色矩形直接通过它的id( rootWindow )引用主机窗口。蓝色单击处理程序通过父引用更改颜色。
前一种情况正常。后一种情况不起作用。看起来根窗口是专门处理的,并且不是父/子层次结构的直接部分,即使矩形逻辑嵌套在代码中也是如此。
有人可以解释这个规则吗?
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
}
}
}
}
答案 0 :(得分:4)
如果您将以下行添加到onClicked
处理程序,您会看到其父级不是Window
:
print(rect2.parent)
输出:
中解释不太明显qml:QQuickRootItem(0x18b18147bc0)
如果将Item分配给数据列表,它将成为Window的contentItem的子项,以便它出现在窗口内。项目的父项将是窗口的contentItem,它是该窗口中项目所有权树的根。
窗口本身不是项目,因此它使用contentItem
代替,以便子项可以拥有父项。
但是,在Qt 5.7中,Window
获得了attached property可用于访问项目窗口的内容:
rect2.Window.window.color = "pink";
Window.window
部分之前的任何项目都是使用附加属性的项目。您可以在此场景中的任何项目上使用它(例如MouseArea
),因为它们都属于同一窗口。
请注意,附加属性会为它们使用的每个唯一项创建一个QObject
派生对象,因此请注意您使用它们的方式,尤其是在大量创建的项目中。