一、视觉父级
使用 Qt Quick 创建视觉场景时,理解视觉父级的概念很重要。
Qt Quick 中的视觉父级概念与 QObject 父级层次结构中的对象父级概念是分开的,但与之相关。所有 QML 对象都有一个父对象,它由声明对象的对象层次结构决定。使用 QtQuick 模块时,Item 类型是该模块提供的所有可视项的基本类型,它提供了附加可视父项的概念,由项的 parent 属性定义。每个项目都有一个视觉父项;如果项目的 parent 属性值为 null,则该项目将不会在场景中呈现。
出于内存管理目的,分配给项目 data 属性的任何对象都将成为其 QObject 层次结构中项目的子项。此外,如果添加到 data 属性的对象是 Item 类型,它也会分配给 Item::children 属性并成为视觉场景层次结构中项目的子项。
为方便起见,Item 的 data 属性是其默认属性。这意味着在 Item 对象中声明的任何子项未分配给特定属性都会自动分配给 data 属性,并成为该项目的子项。
即一般写代码写成左边这样而不必写成右边这样:
可以通过设置其 parent 属性随时更改项目的视觉父级。因此,项目的视觉父级不一定与其对象父级相同。
将一个项目声明为另一个项目的子项目并不自动意味着该子项目将被适当定位或调整大小以适应其父项目。某些 QML 类型可能具有影响子项定位的内置行为,例如 Row 对象自动将其子项重新定位为水平形式。此外,父项不会自动裁剪其子项以将它们可视地包含在父项的视觉边界内,除非其clip 属性设置为 true。
二、堆叠顺序
Qt Quick 项目使用递归绘制算法来确定在发生冲突时将哪些项目绘制在顶部。通常,项目按照它们的创建顺序(或在 QML 文件中指定)绘制在其父项目的顶部。
Item::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"
}
}
三、画布所有权
Qt Quick 场景中渲染内容的定义是基于 QQuickWindow::contentItem 的可视项树。 因此,要将 Item 添加到特定的 Qt Quick 场景以进行渲染,它需要成为已在可视项层次结构中的 Item 的可视层次结构子项,例如 QQuickWindow::contentItem。