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
}
}
}
}
1 回答
如果将以下行添加到
onClicked
处理程序,则'll see that its parent isn' tWindow
:输出:
这在_2815586中解释不那么明显:
窗口本身不是项目,因此它使用contentItem,以便子项目可以拥有父项 .
但是,在Qt 5.7中,
Window
得到了attached property,可以用来访问项目的窗口:在
Window.window
部分之前的任何项目都将是附加属性所使用的项目 . 您可以在此场景中的任何项目上使用它(例如MouseArea
),因为它们都属于同一窗口 .请注意,附加属性为它们使用的每个唯一项创建一个
QObject
-派生对象,因此请注意您如何使用它们,尤其是在非常大的数量中创建的项目中 .