二、QML——Item
1 Item
-
Item类型是所有可视化类型的基类,Item类型是在QtQuick中。Item是继承于QtObject元素。
-
QtQuick中所有可视项都继承自Item。尽管Item对象没有视觉外观,但他定义了所有视觉类型的基本属性,比如x,y位置,宽高以及锚点等。
-
Item类型可以作为根元素包含视觉项目。
import QtQuick 2.0 Item { Image { source: "tile.png" } Image { x: 80 width: 100 height: 100 source: "tile.png" } Image { x: 190 width: 100 height: 100 fillMode: Image.Tile source: "tile.png" } }
2 Item属性
2.1 clip(bool)
该属性表示是否启用了裁剪。默认的 clip
值为 false
如果启用裁剪,项目item将会裁剪自身的绘制内容,以及子项的绘制内容,使其限制在边界矩形内。
代码参考:/assets/Qt6/qml_13_Flicked/01_DisplayLargeImg.qml
2.2 containmentMask(QObject *)
该属性表示用于 contains()
方法的可选遮罩mask。它的主要用途是确定pointer event(如鼠标、触控板或触摸屏)相关的操作事件是否落入item
中。
Item
是通过 contains()
函数来判断是否处于区域内的,但是其默认只判断了矩形范围,并没有对圆角或者图形裁剪等做判断。
给containmentMask赋值的时候,有两种情况:
-
可以使用其他
Item
直接赋值 -
使用
QtObject
赋值,编写相应的contains()
函数。
以下前两个就是使用Item赋值,第三个是使用 QtObject
编写 contains()
函数。
-
通过一个
Item
指定其范围指定contains()
响应。比如:写一个Rectangle
,进入另一个Rectangle
,就会触发。例子参考:/assets/Qt6/qml_02_Item/containmentMask_Rect.qml -
通过一个
Shape
路径指定contains()
响应。 -
通过编写
contains()
函数。返回TRUE,表示在范围内。
默认情况下,contains()
方法对于项目边界框内(比如规则矩形)的任何点都会返回 true。containmentMask
允许更细粒度的控制。例如,如果使用自定义的 C++ QQuickItem
子类,具有专门的 contains()
方法作为 containmentMask
:
2.3 Layer
2.3.1 layer.enabled(bool)
一个 Item
通常会直接渲染到它所属的窗口中。然而,通过设置 layer.enabled
,可以将该Item(以及所有子元素)都会保存到离屏渲染Surface中,此时,只有离屏渲染Surface(其实就是该Surface的内容,也可以看作是一个纹理)会被绘制到窗口中。
如果使能 layer.enabled
,反而感觉是不分层了,或者可以理解为只有一个新的纹理层了。使能后,会把所有含有的元素,叠加到一个层。所以才会有以下不同之处。
如果给Item里面的每个矩形设置0.5的透明度,无论是否使能 layer.enabled
都会出现下面效果。
2.3.2 layer.effect(Component)
如果使能 layer.enabled
,其实就会使得这个 Item
变成一个纹理提供者。
-
可以看成是一个纹理显示元素。通常与OpenGL相结合,实现显示OpenGL纹理。(参考:2023-09-19-25-QML之ShaderEffect)
-
可以与一些渲染阴影、渐变元素相结合。(LinearGradient、Glow等,参考 :2023-09-19-16-QML之Graphs(2D).md)