QML:通过父引用引用根窗口是不可靠的

时间:2016-07-24 18:08:49

标签: qt qml

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 个答案:

答案 0 :(得分:4)

如果您将以下行添加到onClicked处理程序,您会看到其父级不是Window

print(rect2.parent)

输出:

  

qml:QQuickRootItem(0x18b18147bc0)

documentation for Window

中解释不太明显
  

如果将Item分配给数据列表,它将成为Window的contentItem的子项,以便它出现在窗口内。项目的父项将是窗口的contentItem,它是该窗口中项目所有权树的根。

窗口本身不是项目,因此它使用contentItem代替,以便子项可以拥有父项。

但是,在Qt 5.7中,Window获得了attached property可用于访问项目窗口的内容:

rect2.Window.window.color = "pink";

Window.window部分之前的任何项目都是使用附加属性的项目。您可以在此场景中的任何项目上使用它(例如MouseArea),因为它们都属于同一窗口。

请注意,附加属性会为它们使用的每个唯一项创建一个QObject派生对象,因此请注意您使用它们的方式,尤其是在大量创建的项目中。