概念 - 视觉父级Qt Quick

视觉父对象

在使用Qt Quick 创建可视化场景时,理解可视化父级的概念非常重要。

Qt Quick 中视觉父级的概念与QObject 父级层次结构中对象父级的概念是分开的,但又是相关的。所有 QML 对象都有一个对象父级,它由声明对象的对象层次结构决定。在使用QtQuick 模块时,Item 类型是该模块提供的所有可视化项的基本类型,它提供了额外可视化父级的概念,由项的parent 属性定义。每个项目都有一个可视化父项;如果项目的parent 属性值为null ,则该项目不会在场景中渲染。

出于内存管理目的,分配给项目data 属性的任何对象都将成为该项目在其QObject 层次结构中的子对象。此外,如果添加到数据属性的对象是Item 类型,它也会被分配到Item::children 属性,并成为可视化场景层次结构中项目的子对象。(大多数Qt Quick 层次结构抓取算法,尤其是渲染算法,只考虑可视化父层次结构)。

为方便起见,项目data 属性是其默认属性。这就意味着,在Item 对象中声明的任何子项,如果没有分配给特定属性,就会自动分配给data 属性,并如上所述成为该项的子项。因此,下面的两个代码块产生的结果是一样的,而且你几乎总是会看到左下图所示的形式,而不是右下图所示的明确的data 赋值:

import QtQuick 2.0

Item {
    width: 100; height: 100

    Rectangle { width: 50;
                height: 50;
                color: "red" }
}
import QtQuick 2.0

Item {
    width: 100; height: 100

    data: [
        Rectangle { width: 50;
                    height: 50;
                    color: "red" }
    ]
}

通过设置parent 属性,可以随时更改项目的可视化父级。因此,项目的可视化父级不一定与其对象父级相同。

当一个项目成为另一个项目的子项目时:

声明一个项目为另一个项目的子项目,并不自动意味着子项目将被适当地定位或调整大小,以适应其父项目。一些 QML 类型可能有影响子项定位的内置行为(例如,Row 对象会自动将其子项重新定位为水平队形),但这些行为是由类型自身的特定实现执行的。此外,除非clip 属性设置为 true,否则父项不会自动剪切子项,使其在视觉上包含在父项的视觉范围内。

在特殊情况下,项目的可视化父项目可能会受到考虑,具体情况将在下面的章节中介绍。

项目坐标

由于项目坐标是相对于视觉父对象而言的,因此会受到视觉层次结构变化的影响。详情请查看视觉坐标概念页面。

堆叠顺序

Qt Quick 项目使用递归绘制算法来确定在发生碰撞时哪些项目被绘制在顶部。一般来说,项目会按照创建(或在 QML 文件中指定)的顺序绘制在父项目的顶部。因此在下面的示例中,蓝色矩形将绘制在绿色矩形的顶部:

Rectangle {
    color: "#272822"
    width: 320
    height: 480

    Rectangle {
        y: 64
        width: 256
        height: 256
        color: "green"
    }

    Rectangle {
        x: 64
        y: 172
        width: 256
        height: 256
        color: "blue"
    }
}

由于算法是通过可视化项目层次递归的,因此绿色矩形的任何子项也将绘制在蓝色矩形的下方,以及蓝色矩形的任何子项的下方。

堆叠顺序可受Item::z 属性的影响。Z 值低于 0 时,堆叠顺序将低于父代;如果指定了 Z 值,则同级图形将按 Z 值顺序堆叠(创建顺序用于打破并列关系)。Z 值只会影响同级项目和父项目之间的堆叠。如果某个子项被父项上方的子树遮挡,那么该子项上的任何 Z 值都不会增加其堆叠顺序,使其堆叠在该子树上方。要想将该项目堆叠到另一个子树之上,就必须改变层次结构中更高处的 z 值,或者重新排列视觉项目层次结构。

Rectangle {
    color: "#272822"
    width: 320
    height: 480

    Rectangle {
        y: 64
        z: 1
        width: 256
        height: 256
        color: "green"

        Rectangle {
            x: 192
            y: 64
            z: 2000
            width: 128
            height: 128
            color: "red"
        }
    }

    Rectangle {
        x: 64
        y: 192
        z: 2
        width: 256
        height: 256
        color: "blue"
    }
}

在上面的例子中,红色矩形的 z 值很高,但仍堆叠在蓝色矩形的下面。这是因为红色矩形是绿色矩形的子矩形,而绿色矩形是蓝色矩形的兄弟矩形。绿色矩形的 Z 值低于蓝色矩形的 Z 值,因此绿色矩形及其所有子矩形都将堆叠在蓝色矩形的下方。

画布所有权

Qt Quick 场景中渲染内容的定义是根植于QQuickWindow::contentItem 的可视化项目树。因此,要将一个项目添加到特定的Qt Quick 场景中进行渲染,该项目需要成为视觉项目层次结构中已有项目的视觉层次结构子项,如QQuickWindow::contentItem

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.