本页内容

GridView QML Type

用于指定模型提供的项目的网格视图。更多内容...

Import Statement: import QtQuick
Inherits:

Flickable

属性

关联属性

附加信号

方法

详细说明

GridView 用于显示来自内置 QML 类型(如ListModel 和XmlListModel )所创建的模型数据,或来自在 C++ 中定义且继承自QAbstractListModel 的自定义模型类的数据。

GridView 包含一个model ,用于定义要显示的数据;以及一个delegate ,用于定义数据的显示方式。GridView 中的项目可按水平或垂直方向排列。由于 GridView 继承自Flickable ,因此其视图天生支持滑动操作。

使用示例

以下示例展示了在名为 `ContactModel.qml` 的文件中定义的一个简单列表模型:

import QtQuick

ListModel {

    ListElement {
        name: "Jim Williams"
        portrait: "pics/portrait.png"
    }
    ListElement {
        name: "John Brown"
        portrait: "pics/portrait.png"
    }
    ListElement {
        name: "Bill Smyth"
        portrait: "pics/portrait.png"
    }
    ListElement {
        name: "Sam Wise"
        portrait: "pics/portrait.png"
    }
}

带图标的联系人列表:吉姆·威廉姆斯、约翰·布朗、比尔·史密斯、萨姆·怀斯

该模型可在其他 QML 文件中作为ContactModel 进行引用。有关创建此类可重用组件的更多信息,请参阅QML 模块。

另一个组件可以在 GridView 中显示此模型数据,如下例所示:该示例为其模型创建了一个ContactModel 组件,并为其委托创建了一个Column (包含Image 和Text 项)。


import QtQuick

GridView {
    width: 300; height: 200

    model: ContactModel {}
    delegate: Column {
        Image { source: portrait; anchors.horizontalCenter: parent.horizontalCenter }
        Text { text: name; anchors.horizontalCenter: parent.horizontalCenter }
    }
}

联系表格中,约翰·布朗的名字以蓝色高亮显示

该视图将为模型中的每个项目创建一个新的委托。请注意,该委托能够直接访问模型的name 和portrait 数据。

下图展示了一个经过优化的网格视图。委托的视觉效果得到了改进,并被移入一个独立的contactDelegate 组件中。


Rectangle {
    width: 300; height: 200

    Component {
        id: contactDelegate
        Item {
            width: grid.cellWidth; height: grid.cellHeight
            Column {
                anchors.fill: parent
                Image { source: portrait; anchors.horizontalCenter: parent.horizontalCenter }
                Text { text: name; anchors.horizontalCenter: parent.horizontalCenter }
            }
        }
    }

    GridView {
        id: grid
        anchors.fill: parent
        cellWidth: 80; cellHeight: 80

        model: ContactModel {}
        delegate: contactDelegate
        highlight: Rectangle { color: "lightsteelblue"; radius: 5 }
        focus: true
    }
}

当前选中的项目通过highlight 属性使用蓝色Rectangle 进行突出显示,并将focus 设置为true ,以启用网格视图的键盘导航。网格视图本身是一个焦点范围(更多详细信息请参阅 Qt Quick 中的“键盘焦点”)。

委托会根据需要实例化,并可能随时被销毁。绝不应在委托中存储状态。

GridView 会向委托的根项附加若干属性,例如GridView.isCurrentItem 。在下面的示例中,根委托项可以直接通过GridView.isCurrentItem 访问此附加属性,而子contactInfo 对象则必须通过wrapper.GridView.isCurrentItem 引用此属性。

GridView {
    width: 300; height: 200
    cellWidth: 80; cellHeight: 80

    Component {
        id: contactsDelegate
        Rectangle {
            id: wrapper
            width: 80
            height: 80
            color: GridView.isCurrentItem ? "black" : "red"
            Text {
                id: contactInfo
                text: name + ": " + number
                color: wrapper.GridView.isCurrentItem ? "red" : "black"
            }
        }
    }

    model: ContactModel {}
    delegate: contactsDelegate
    focus: true
}

注意:视图 不会自动设置clip 属性。如果视图未被其他项目或屏幕裁剪,则必须将此属性设置为 true,以便裁剪部分或完全位于视图之外的项目。

GridView 布局

GridView 中项的布局可通过以下属性进行控制:

  • flow - 控制项目是按从左到右(以行形式排列)还是从上到下(以列形式排列)的方式排列。该值可以是 GridView.FlowLeftToRight 或 GridView.FlowTopToBottom。
  • layoutDirection - 控制水平布局方向:即项目是从视图左侧向右侧排列,还是反之。该值可以是 Qt.LeftToRight 或 Qt.RightToLeft。
  • verticalLayoutDirection - 控制垂直布局方向:即项目是从视图顶部向底部排列,还是反之。该值可以是 GridView.TopToBottom 或 GridView.BottomToTop。

默认情况下,GridView 从左向右排列,项目在水平方向上从左到右排列,在垂直方向上从上到下排列。

这些属性可以组合使用,以生成多种布局,如下表所示。第一行中的所有 GridView 的 `flow ` 值均为 `GridView.FlowLeftToRight`,但采用了不同的水平和垂直布局方向组合(分别由 `layoutDirection ` 和 `verticalLayoutDirection ` 指定)。 同样,下表第二行中的所有 GridView 对象其 `flow ` 值均为 `GridView.FlowTopToBottom`,但通过不同组合的水平和垂直布局方向,以不同方式排列其项目。

采用 GridView.FlowLeftToRight 布局方向的GridView
(H)从左到右(V)从上到下

网格中包含0-11号项目,从左向右排列,行从上到下排列

(H)从右向左(V)从上到下

网格中包含0-11号项目,从右向左排列,行从上到下排列

(H)从左到右(V)从下到上

网格中包含0-11号项目,从左向右排列,行从下到上排列

(H)从右向左(V)从下向上

网格中包含0-11号项目,从右向左排列,行从下往上排列

采用 GridView.FlowTopToBottom 流向的GridView
(H)从左到右(V)从上到下

网格中包含0-11号项目,从上到下排列,列从左到右排列

(H)从右向左(V)从上到下

网格中包含0-11号项目,从上到下排列,列从右到左排列

(H)从左到右(V)从下到上

网格中包含0-11号项目,从下往上排列,列从左到右排列

(H)从右到左(V)从下到上

网格中包含0-11号项目,从下往上排列,列从右向左排列

另请参阅 QML 数据模型、ListView 、PathView 以及Qt Quick 示例 - 视图。

属性文档

add : Transition

该属性用于指定要应用于添加到视图中的项目的过渡效果。

例如,以下是一个指定此类过渡效果的视图:

GridView {
    ...
    add: Transition {
        NumberAnimation { properties: "x,y"; from: 100; duration: 1000 }
    }
}

每当有项目被添加到上述视图中时,该项目将从位置 (100,100) 开始,在 1 秒内通过动画效果移动到其在视图中的最终 x、y 位置。 该过渡效果仅适用于新增到视图中的项目;对于因新增项目而被挤出的下方项目,该效果不适用。若要为被挤出的项目添加动画效果,请设置 `displaced ` 或 `addDisplaced ` 属性。

有关如何使用视图过渡的更多详细信息和示例,请参阅ViewTransition 文档。

注意:此 过渡效果不适用于在视图初始加载时创建的项目,也不适用于视图的model 发生变化时创建的项目。(在这些情况下,将应用populate 过渡效果。)此外,此过渡效果不应为新项目的高度添加动画;否则会导致新项目下方的任何项目被布局在错误的位置。 相反,可以在委托中的onAdd 处理程序内对高度进行动画处理。

另请参阅 addDisplaced 、populate 和ViewTransition 。

addDisplaced : Transition

该属性用于指定当视图中因添加其他项目而导致现有项目位置发生偏移时,应应用于这些项目的过渡效果。

例如,以下是一个指定此类过渡效果的视图:

GridView {
    ...
    addDisplaced: Transition {
        NumberAnimation { properties: "x,y"; duration: 1000 }
    }
}

每当向上述视图中添加一个项目时,新项目下方所有项目都会被挤出,导致它们在视图内向下移动(如果是水平方向的视图,则向侧面移动)。 当发生这种位移时,项目在视图内移动至新 x、y 位置的过程将按照指定设置,通过“NumberAnimation ”在 1 秒内完成动画效果。此过渡效果不适用于刚被添加到视图中的新项目;若要为新增项目添加动画效果,请设置 `add ` 属性。

如果一个项目同时受到多种操作的位移影响,则未明确规定应应用 addDisplaced、moveDisplaced 还是removeDisplaced 过渡效果。此外,如果无需根据项目是因添加、移动还是移除操作而位移来指定不同的过渡效果,请考虑改设displaced 属性。

有关如何使用视图过渡的更多详细信息和示例,请参阅ViewTransition 文档。

注意:此 过渡效果不适用于在视图初始加载时,或视图的“model ”发生变化时创建的项目。在这些情况下,将应用“populate ”过渡效果。

另请参阅 displaced 、add 、populate 以及ViewTransition 。

cacheBuffer : int

此属性决定是否在视图的可见区域之外保留委托。

如果该值大于零,视图可能会保留尽可能多的已实例化委托,直到达到指定缓冲区所能容纳的上限为止。 例如,如果在垂直视图中,委托的高度为 20 像素,有 3 列,并且将 `cacheBuffer ` 设置为 40,则在可见区域上方和下方最多可创建/保留 6 个委托。 缓冲的委托是异步创建的,这使得创建过程可以跨越多个帧进行,从而降低了跳帧的可能性。为了提高绘制性能,可见区域外的委托不会被绘制。

该属性的默认值取决于平台,但通常为大于零的数值。负值将被忽略。

请注意,cacheBuffer 并非像素缓冲区——它仅用于维护额外的已实例化委托对象。

注意:设置 此属性并不能替代创建高效的委托。它可以通过消耗额外的内存来提高滚动行为的流畅度。 委托中的对象和绑定越少,视图的滚动速度就越快。需要注意的是,设置 `cacheBuffer` 只能推迟因加载缓慢的委托而引发的问题,并不能解决此类情况。

cacheBuffer 的作用范围不包含由 `displayMarginBeginning ` 或 `displayMarginEnd` 指定的任何显示边距。

cellHeight : real

cellWidth : real

这些属性用于存储网格中每个单元格的宽度和高度。

默认单元格尺寸为 100×100。

count : int [read-only]

该属性保存模型中的项目数量。

currentIndex : int

currentItem : Item [read-only]

currentIndex 属性保存当前项的索引,currentItem 保存当前项。将currentIndex 设置为 -1 将清除高亮并使currentItem 变为 null。

如果highlightFollowsCurrentItem 等于true ,则设置其中任意一个属性都会使GridView 平滑滚动,从而使当前项目显示出来。

请注意,在当前项目在视图中可见之前,其位置可能仅为近似值。

delegate : Component

该委托提供了一个模板,用于定义由视图实例化的每个项目。索引作为可访问的index 属性对外暴露。根据数据模型的类型,模型的属性也可供使用。

委托中的对象和绑定数量会直接影响视图的翻动性能。如果可能的话,请将委托正常显示所不需要的功能放置在Loader 中,该 可在需要时加载额外的组件。

GridView 的项目大小由cellHeight 和cellWidth 决定。它不会根据委托中根项目的大小来调整项目大小。

委托实例的默认stacking order 为1 。

注意:委托对象 按需实例化,并可能随时被销毁。绝不应在委托对象中存储状态。

delegateModelAccess : enumeration [since 6.10]

此属性决定了委托如何访问模型。

常量描述
DelegateModel.ReadOnly禁止委托通过上下文属性、model 对象或必填属性写入模型。
DelegateModel.ReadWrite允许委托通过上下文属性、model 对象或必填属性写入模型。
DelegateModel.Qt5ReadWrite允许委托通过model 对象和上下文属性写入模型,但不能通过必填属性写入模型。

默认值为 `DelegateModel.Qt5ReadWrite`。

该属性在 Qt 6.10 中引入。

另请参阅 《Qt Quick 中的模型与视图》#更改模型数据。

displaced : Transition

该属性存储了适用于因任何影响视图的模型操作而被移动的项的通用过渡。

这为因添加、移动或移除操作而发生位移的项目指定通用过渡提供了便利,无需单独指定addDisplaced 、moveDisplaced 和removeDisplaced 属性。例如,以下视图指定了位移过渡:

GridView {
    ...
    displaced: Transition {
        NumberAnimation { properties: "x,y"; duration: 1000 }
    }
}

当上述视图中的任何项目被添加、移动或移除时,其下方的项目会发生位移,导致它们在视图内向下移动(若为水平布局,则向侧面移动)。随着这种位移发生,项目向视图内新 x、y 位置的移动将按照指定,通过NumberAnimation 过渡效果在 1 秒内完成动画。

如果一个视图既指定了这种通用的位移过渡,又指定了具体的addDisplaced 、moveDisplaced 或removeDisplaced 过渡,那么在发生相关操作时,系统将使用更具体的过渡代替通用的位移过渡——前提是该更具体的过渡未被禁用(通过将enabled 设置为false)。如果该过渡确实已被禁用,则会应用通用的位移过渡。

有关如何使用视图转换的更多详细信息和示例,请参阅ViewTransition 文档。

另请参阅 addDisplaced 、moveDisplaced 、removeDisplaced 以及ViewTransition 。

displayMarginBeginning : int [since QtQuick 2.3]

displayMarginEnd : int [since QtQuick 2.3]

此属性允许在视图几何范围之外显示委托对象。

如果该值不为零,视图将在视图起始位置之前或结束位置之后创建额外的委托。视图将创建尽可能多的委托,直到填满指定的像素大小为止。

例如,如果在垂直视图中,委托的高度为 20 像素,共有 3 列,且 `displayMarginBeginning ` 和 `displayMarginEnd ` 均设置为 40,则将在上方和下方各创建并显示 6 个委托。

默认值为 0。

此属性旨在允许某些 UI 配置,而非用于性能优化。如果您出于性能考虑希望在视图几何范围之外创建委托,则可能需要使用cacheBuffer 属性。

这些属性在 QtQuick 2.3 中引入。

effectiveLayoutDirection : enumeration [read-only]

该属性存储网格的有效布局方向。

当使用附加属性 `LayoutMirroring::enabled ` 进行区域布局时,网格的视觉布局方向将被镜像。但是,属性 `layoutDirection ` 将保持不变。

另请参阅 GridView::layoutDirection 和LayoutMirroring 。

flow : enumeration

该属性控制网格的流向。

可能的取值:

常量描述
GridView.FlowLeftToRight(默认)项目从左到右排列,视图垂直滚动
GridView.FlowTopToBottom项目从上到下排列,视图水平滚动

该属性用于指定用作页脚的组件。

每个视图都会创建一个页脚组件的实例。页脚位于视图末尾,在所有项目之后。页脚的默认stacking order 为1 。

另请参阅 header 和footerItem 。

footerItem : Item [read-only]

此处包含由footer 组件生成的页脚项。

每个视图都会创建一个页脚组件的实例。页脚位于视图末尾,紧随所有项目之后。页脚的默认stacking order 为1 。

另请参阅 footer 和headerItem 。

header : Component

该属性用于指定作为页眉的组件。

每个视图都会创建一个标题组件的实例。标题位于视图的开头,在任何项目之前。标题的默认stacking order 为1 。

另请参阅 footer 和headerItem 。

headerItem : Item [read-only]

此处存放由header 组件生成的标题项。

每个视图都会创建一个标题组件的实例。标题位于视图的开头,在任何项目之前。标题的默认stacking order 为1 。

另请参阅 header 和footerItem 。

highlight : Component

该属性用于指定用作高亮效果的组件。

每个视图都会创建一个高亮组件的实例。生成的组件实例的几何图形将由视图进行管理,以便始终与当前项目保持关联,除非highlightFollowsCurrentItem 属性设置为false。高亮项的默认stacking order 为0 。

另请参阅 highlightItem 和highlightFollowsCurrentItem 。

highlightFollowsCurrentItem : bool

此属性用于设置高亮效果是否由视图管理。

如果该属性为 true(默认值),则高亮标记会平滑移动以跟随当前项目。否则,视图不会移动高亮标记,任何移动都必须由高亮标记自身实现。

以下是一个高亮示例,其运动由SpringAnimation 项定义:

Component {
    id: highlight
    Rectangle {
        width: view.cellWidth; height: view.cellHeight
        color: "lightsteelblue"; radius: 5
        x: view.currentItem.x
        y: view.currentItem.y
        Behavior on x { SpringAnimation { spring: 3; damping: 0.2 } }
        Behavior on y { SpringAnimation { spring: 3; damping: 0.2 } }
    }
}

GridView {
    id: view
    width: 300; height: 200
    cellWidth: 80; cellHeight: 80

    model: ContactModel {}
    delegate: Column {
        Image { source: portrait; anchors.horizontalCenter: parent.horizontalCenter }
        Text { text: name; anchors.horizontalCenter: parent.horizontalCenter }
    }

    highlight: highlight
    highlightFollowsCurrentItem: false
    focus: true
}

highlightItem : Item [read-only]

此属性保存由highlight 组件创建的高亮项。

除非将 `highlightFollowsCurrentItem ` 设置为 `false`,否则 `highlightItem` 由视图管理。高亮项的默认 `stacking order ` 为 `0`。

另请参阅 highlight 和highlightFollowsCurrentItem 。

highlightMoveDuration : int

此属性存储高亮委托的移动动画时长。

highlightFollowsCurrentItem 该属性必须为 true 才生效。

该属性的默认持续时间为 150 毫秒。

另请参阅 highlightFollowsCurrentItem 。

highlightRangeMode : enumeration

preferredHighlightBegin : real

preferredHighlightEnd : real

这些属性定义了(当前项目)在视图中被高亮显示的首选范围。preferredHighlightBegin 的值必须小于preferredHighlightEnd 的值。

这些属性会影响视图滚动时当前项的位置。例如,如果希望在滚动视图时当前选中的项始终位于视图中央,请将preferredHighlightBegin 和preferredHighlightEnd 的值分别设置为中央项所在位置的顶部和底部坐标。 如果通过编程方式更改currentItem ,视图将自动滚动,使当前项目位于视图中央。此外,无论是否存在高亮显示,当前项目索引的行为都会生效。

highlightRangeMode 的有效值包括:

常量描述
GridView.ApplyRange视图会尝试将高亮保持在该范围内。但是,高亮可能会在视图两端或因鼠标交互而移出该范围。
GridView.StrictlyEnforceRange高亮区域绝不会移出该范围。如果键盘或鼠标操作会导致高亮区域移出范围,则当前项目会发生变化。
GridView.NoHighlightRange默认值

keyNavigationEnabled : bool

该属性用于控制网格的键盘导航功能是否启用。

如果该属性值为true ,则用户可以使用键盘在视图中进行导航。这对于需要有选择地启用或禁用鼠标和键盘交互的应用程序非常有用。

默认情况下,该属性的值与interactive 属性绑定,以确保与现有应用程序的行为兼容。当显式设置时,它将不再与interactive属性绑定。

另请参阅 interactive 。

keyNavigationWraps : bool

该属性控制网格是否在键导航时进行环回

如果该属性值为 true,则原本会将当前项目选择移动到视图一端之外的键导航,将自动环绕并移动选择到视图的另一端。

默认情况下,键导航不进行循环。

layoutDirection : enumeration

该属性用于指定网格的布局方向。

可能的取值:

常量描述
Qt.LeftToRight(默认)项目将从左上角开始布局。布局流取决于GridView::flow 属性。
Qt.RightToLeft项目将从右上角开始排列。排列方向取决于GridView::flow 属性。

注意:如果GridView::flow 设置为GridView.FlowLeftToRight,请勿将其与GridView::layoutDirection设置为Qt.RightToLeft的情况混淆。GridView.FlowLeftToRight的流值仅表示流方向为水平。

另请参见 GridView::effectiveLayoutDirection 和GridView::verticalLayoutDirection 。

model : model

该属性存储为网格提供数据的模型。

该模型提供了一组数据,用于在视图中创建项目。模型可以直接在 QML 中使用 `ListModel`、`DelegateModel`、`ObjectModel` 创建,也可以由 C++ 模型类提供。如果使用 C++ 模型类,它必须是 `QAbstractItemModel ` 的子类,或者是一个简单的列表。

另请参阅 “数据模型”。

move : Transition

该属性用于指定在视图的model 中因移动操作而被移动的视图项应应用的过渡效果。

例如,以下是一个指定此类过渡效果的视图:

GridView {
    ...
    move: Transition {
        NumberAnimation { properties: "x,y"; duration: 1000 }
    }
}

每当model 执行移动操作以移动特定的一组索引时,视图中的相应项目将通过一秒的动画过渡到其在视图中的新位置。 该过渡效果仅适用于模型中移动操作的目标项;不适用于因移动操作而被挤出的下方项。若要为被挤出的项添加动画效果,请设置displaced 或moveDisplaced 属性。

有关如何使用视图过渡的更多详细信息和示例,请参阅ViewTransition 文档。

另请参阅 moveDisplaced 和ViewTransition 。

moveDisplaced : Transition

该属性用于指定在视图的model 中,因移动操作而发生位置偏移的项目应应用的过渡效果。

例如,以下是一个指定此类过渡的视图:

GridView {
    ...
    moveDisplaced: Transition {
        NumberAnimation { properties: "x,y"; duration: 1000 }
    }
}

每当model 执行移动操作以移动特定索引范围时,位于该移动操作源索引与目标索引之间的项目会被位移,导致它们在视图内向上或向下移动(若为水平方向,则向侧面移动)。 当发生这种位移时,项目在视图内移动至新 x、y 坐标的过程将按照指定设置,通过NumberAnimation 在1秒内完成动画效果。此过渡效果不适用于移动操作的实际目标项目;若要为已移动的项目添加动画效果,请设置move 属性。

如果一个项目同时受到多种类型的操作影响而发生位移,则未定义将应用addDisplaced 、moveDisplaced还是removeDisplaced 过渡效果。此外,如果无需根据项目是受添加、移动还是移除操作影响而指定不同的过渡效果,建议改设displaced 属性。

有关如何使用视图过渡的更多详细信息和示例,请参阅ViewTransition 文档。

另请参阅 displaced 、move 以及ViewTransition 。

populate : Transition

此属性用于指定应应用于视图初始创建的项目的过渡效果。

当出现以下情况时,该属性将应用于所有创建的项:

  • 首次创建视图时
  • 视图的model 发生变化,导致可见的委托被完全替换
  • 当视图的model 为reset 时(前提是模型是QAbstractItemModel 的子类)

例如,以下是一个指定此类过渡的视图:

GridView {
    ...
    populate: Transition {
        NumberAnimation { properties: "x,y"; duration: 1000 }
    }
}

当视图初始化时,视图将创建所有必要的项目,然后在1秒内将它们动画化至视图内的正确位置。

然而,后续滚动视图时,即使代理会在可见时被实例化,populate过渡也不会运行。当模型发生变化导致新代理变得可见时,运行的将是add 过渡。因此,不应依赖populate 过渡来初始化代理中的属性,因为它并不适用于每个代理。 如果您的动画设置了某个属性的 `to ` 值,则该属性初始时应具有 `to ` 值,并且动画应设置 `from ` 值以供动画使用:

GridView {
    ...
    delegate: Rectangle {
        opacity: 1 // not necessary because it's the default; but don't set 0
        ...
    }
    populate: Transition {
        NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 1000 }
    }
}

有关如何使用视图过渡的更多详细信息和示例,请参阅ViewTransition 文档。

另请参阅 add 和ViewTransition 。

remove : Transition

该属性用于指定对从视图中移除的项目应用的过渡效果。

例如,以下是一个指定此类过渡效果的视图:

GridView {
    ...
    remove: Transition {
        ParallelAnimation {
            NumberAnimation { property: "opacity"; to: 0; duration: 1000 }
            NumberAnimation { properties: "x,y"; to: 100; duration: 1000 }
        }
    }
}

每当有项目从上述视图中移除时,该项目将在一秒内通过动画移动到位置 (100,100),同时其不透明度也会变为 0。 该过渡效果仅适用于从视图中移除的项目;不适用于因项目移除而被挤到下方的项目。若要为被挤出的项目添加动画效果,请设置displaced 或removeDisplaced 属性。

请注意,在应用过渡效果时,该项目已从模型中移除;对已移除索引的模型数据的任何引用都将失效。

此外,如果为委托项设置了delayRemove 附加属性,则“移除”过渡效果将不会生效,直到delayRemove 再次变为false为止。

有关如何使用视图转换的更多详细信息和示例,请参阅ViewTransition 文档。

另请参阅 removeDisplaced 和ViewTransition 。

removeDisplaced : Transition

该属性用于指定当视图中的其他项目被移除时,导致位置发生变化的视图项目应应用的过渡效果。

例如,以下是一个指定此类过渡效果的视图:

GridView {
    ...
    removeDisplaced: Transition {
        NumberAnimation { properties: "x,y"; duration: 1000 }
    }
}

每当从上述视图中移除一个项目时,其下方的所有项目都会发生位移,导致它们在视图内向上移动(如果是水平方向的,则向侧面移动)。 当这种位移发生时,元素向视图内新 x、y 位置的移动将按照指定设置,通过“NumberAnimation ”过渡效果在 1 秒内完成动画。此过渡效果不适用于实际从视图中移除的元素;若要为被移除的元素添加动画效果,请设置remove 属性。

如果一个项目同时受到多种操作的影响而发生位移,则未明确规定应应用addDisplaced 、moveDisplaced 还是removeDisplaced过渡效果。此外,如果无需根据项目是因添加、移动还是移除操作而位移来指定不同的过渡效果,建议改设displaced 属性。

有关如何使用视图过渡的更多详细信息和示例,请参阅ViewTransition 文档。

另请参阅 displaced 、remove 以及ViewTransition 。

reuseItems : bool

此属性允许您重用从delegate 实例化的项目。如果将其设置为false ,则会销毁当前池中的所有项目。

该属性的默认值为false 。

另请参阅 Reusing items 、pooled() 和reused()。

snapMode : enumeration

此属性决定了在拖动或轻扫操作后,视图滚动将如何稳定下来。可能的取值包括:

Constant描述
GridView.NoSnap(默认)视图将在可见区域内的任意位置停止。
GridView.SnapToRow视图停靠时,其一行(或对于GridView.FlowTopToBottom 流则为一列)与视图起始位置对齐。
GridView.SnapOneRow视图的最终定位距离鼠标按钮释放时可见的第一行(或GridView.FlowTopToBottom 流中的第一列)不超过一行。此模式特别适用于每次移动一页的情况。

verticalLayoutDirection : enumeration

该属性用于指定网格的垂直布局方向。

可能的取值:

常量描述
GridView.TopToBottom(默认)项目从视图顶部向视图底部排列。
GridView.BottomToTop项目从视图底部向上排列至视图顶部。

另请参阅 GridView::layoutDirection 。

附加属性文档

GridView.delayRemove : bool [attached]

此附加属性用于控制委托是否可以被销毁。它附加在每个委托实例上。默认值为 false。

有时需要延迟项的销毁,直到动画完成为止。下面的示例委托可确保在将项从列表中移除之前,动画已先完成。

Component {
    id: delegate
    Item {
        GridView.onRemove: SequentialAnimation {
            PropertyAction { target: wrapper; property: "GridView.delayRemove"; value: true }
            NumberAnimation { target: wrapper; property: "scale"; to: 0; duration: 250; easing.type: Easing.InOutQuad }
            PropertyAction { target: wrapper; property: "GridView.delayRemove"; value: false }
        }
    }
}

如果已指定remove 过渡效果,则该效果不会立即应用,直到`delayRemove`返回`false`。

GridView.isCurrentItem : bool [read-only attached]

如果该委托是当前项,则此附加属性为 true;否则为 false。

它附着于该委托的每个实例上。

GridView {
    width: 300; height: 200
    cellWidth: 80; cellHeight: 80

    Component {
        id: contactsDelegate
        Rectangle {
            id: wrapper
            width: 80
            height: 80
            color: GridView.isCurrentItem ? "black" : "red"
            Text {
                id: contactInfo
                text: name + ": " + number
                color: wrapper.GridView.isCurrentItem ? "red" : "black"
            }
        }
    }

    model: ContactModel {}
    delegate: contactsDelegate
    focus: true
}

GridView.view : GridView [read-only attached]

此附加属性保存了管理该委托实例的视图。

它被附加到每个委托实例上,同时也附加到页眉、页脚和高亮委托上。

附加信号文档

[attached] add()

当项目被添加到视图后,会立即触发此附加信号。

注意: 相应的处理程序 为onAdd 。

[attached] pooled()

当某个项目被添加到重用池后,会触发此信号。您可以利用它来暂停该项目内部正在运行的计时器或动画,或者释放无法重用的资源。

仅当reuseItems 属性为true 时,才会发出此信号。

注意: 对应的处理程序 为onPooled 。

另请参阅 Reusing items 、reuseItems 以及reused()。

[attached] remove()

当视图中的某个项目被移除之前,会立即触发此关联信号。

如果已指定移除过渡效果,则在处理此信号后应用该过渡效果,前提是delayRemove 的值为false。

注意: 相应的处理程序 是onRemove 。

[attached] reused()

该信号在项目被重用后触发。此时,该项目已被从资源池中取出并放置到内容视图中,且模型属性(如index 和row )已更新。

当项目被复用时,模型未提供的其他属性不会发生变化。您应避免在委托中存储任何状态,但如果确实存储了,请在接收到此信号时手动重置该状态。

该信号在项目被重用时发出,而不是在项目首次创建时。

只有当reuseItems 属性为true 时,才会发出此信号。

注意: 相应的处理程序 为 `onReused`。

另请参阅 Reusing items 、reuseItems 和pooled()。

方法文档

void forceLayout()

对模型变化的响应通常以批处理方式进行,每帧仅执行一次。这意味着在脚本块内部,底层模型可能已经发生变化,但GridView 尚未更新。

此方法会强制GridView 立即响应模型中任何未处理的变更。

注意:仅应在组件处理完成后才调用这些方法。

int indexAt(real x, real y)

返回包含坐标x 、y (在content item 坐标系中)的可见项的索引。如果指定位置不存在该项,或者该项不可见,则返回-1。

如果该项位于可见区域之外,则返回 -1,无论滚动至该位置时该处是否会出现该项。

注意:若将 MouseArea 作为GridView 的子元素添加,其返回的位置将采用GridView 坐标系,而非内容项坐标系。若要在调用此函数时使用这些位置,需先进行坐标映射:

GridView {
    id: view
    MouseArea {
        anchors.fill: parent
        onClicked: (mouse) => {
            let posInGridView = Qt.point(mouse.x, mouse.y)
            let posInContentItem = mapToItem(view.contentItem, posInGridView)
            let index = view.indexAt(posInContentItem.x, posInContentItem.y)
        }
    }
}

注意:仅应在组件加载完成后调用这些方法。

另请参阅 itemAt 。

Item itemAt(real x, real y)

返回包含坐标x 、y (以content item 坐标系为基准)的可见项目。如果指定位置不存在项目,或者该项目不可见,则返回null。

如果该项位于可见区域之外,则返回 null,无论滚动至该位置时该处是否存在项。

注意:仅应在组件初始化完成后调用这些方法。

另请参阅 indexAt 。

Item itemAtIndex(int index)

返回index 对应的项。如果该索引下没有对应的项(例如,因为该项尚未创建,或者因平移操作已超出可见区域并从缓存中移除),则返回null。

注意:此方法应仅在组件完成加载后调用。此外,不应存储返回值,因为一旦控件脱离调用范围,如果视图释放了该项,返回值可能会立即变为 null。

void moveCurrentIndexDown()

将currentIndex 在视图中向下移动一个项目。如果keyNavigationWraps 为true且当前位于末尾,则当前索引将回环。如果count 为零,则此方法无效。

注意:仅应在组件(Component)完成渲染后才调用这些方法。

void moveCurrentIndexLeft()

将currentIndex 在视图中向左移动一个项目。如果keyNavigationWraps 为真且当前位于末尾,则当前索引将进行循环。如果count 为零,则此方法无效。

注意:仅应在组件加载完成后调用这些方法。

void moveCurrentIndexRight()

将currentIndex 在视图中向右移动一个项目。如果keyNavigationWraps 为真且当前位于末尾,则当前索引将循环回起始位置。如果count 为零,则此方法无效。

注意:仅应在组件加载完成后才调用这些方法。

void moveCurrentIndexUp()

将currentIndex 在视图中向上移动一个位置。如果keyNavigationWraps 为true且当前位于末尾,则当前索引将循环回首。如果count 为零,则此方法无效。

注意:仅应在组件加载完成后才调用这些方法。

void positionViewAtBeginning()

void positionViewAtEnd()

将视图定位在起始或末尾位置,同时考虑任何页眉或页脚。

不建议使用 `contentX ` 或 `contentY ` 方法将视图定位到特定索引位置。这是因为从列表开头删除项目并不会导致所有其他项目重新定位,而且视图的实际起始位置可能会因委托对象的大小而有所不同,因此这种方法并不可靠。

注意:仅应在组件完成加载后调用这些方法。若要在启动时定位视图,应通过 Component.onCompleted 调用此方法。例如,要在启动时将视图定位到末尾:

Component.onCompleted: positionViewAtEnd()

void positionViewAtIndex(int index, PositionMode mode)

将视图定位,使index 位于mode 指定的位置:

常量描述
GridView.Beginning将该项置于视图顶部(若采用GridView.FlowTopToBottom 布局则置于左侧)。
GridView.Center将项目置于视图中央。
GridView.End将项目置于视图底部(若为水平方向则置于右侧)。
GridView.Visible如果项目的任何部分可见,则不采取任何操作;否则,将项目带入视图。
GridView.Contain确保整个项目可见。如果项目大于视图,则将其定位在视图顶部(对于GridView.FlowTopToBottom 布局则位于左侧)。
GridView.SnapPosition将项目定位在preferredHighlightBegin 处。此模式仅在highlightRangeMode 设置为StrictlyEnforceRange ,或通过snapMode 启用了对齐功能时才有效。

如果将视图定位在该索引会导致视图开头或结尾显示空白区域,则视图将被定位在边界处。

不建议使用contentX 或contentY 将视图定位在特定索引位置。这是不可靠的,因为从视图开头移除项目并不会导致所有其他项目重新定位。将项目带入视图的正确方法是使用positionViewAtIndex 。

注意:这些方法应仅在 Component 完成加载后调用。若要在启动时定位视图,应由 Component.onCompleted 调用此方法。例如,若要将视图定位到末尾:

Component.onCompleted: positionViewAtIndex(count - 1, GridView.Beginning)

© 2026 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.