首页 文章

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

提问于
浏览
3

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 回答

  • 4

    如果将以下行添加到 onClicked 处理程序,则'll see that its parent isn' t Window

    print(rect2.parent)
    

    输出:

    qml:QQuickRootItem(0x18b18147bc0)

    这在_2815586中解释不那么明显:

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

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

    但是,在Qt 5.7中, Window 得到了attached property,可以用来访问项目的窗口:

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

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

    请注意,附加属性为它们使用的每个唯一项创建一个 QObject -派生对象,因此请注意您如何使用它们,尤其是在非常大的数量中创建的项目中 .

相关问题