You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在QML的GridView中实现类似iPhone的项目分组?

实现QML GridView的iPhone视频式分组效果

嘿,我刚好折腾过类似的效果,给你分享一下具体的实现思路和代码示例,应该能完美匹配你想要的iPhone视频APP里的分组样式!

核心实现思路

要实现这种分组效果,我们主要依赖QML GridView的section分组功能,再配合自定义的分组标题代理和项代理,就能复刻出类似的视觉效果:

  • 用section属性绑定数据模型里的分组字段,让GridView自动按组划分内容
  • 自定义section.delegate来渲染每个分组的标题,还原iPhone里的大字号、左侧对齐的标题样式
  • 调整布局参数,给分组之间留出合适的间距,让组与组的边界更清晰

完整代码示例

下面是一个可直接运行的完整示例,包含数据模型、分组GridView和自定义样式:

import QtQuick 2.15
import QtQuick.Controls 2.15

ApplicationWindow {
    width: 375  // 模拟iPhone宽度
    height: 667
    visible: true
    title: "iPhone Style Grid Grouping"

    // 模拟视频数据模型,包含分组字段category
    ListModel {
        id: videoModel
        ListElement { title: "视频1"; category: "最近观看"; thumbnail: "https://via.placeholder.com/120x180" }
        ListElement { title: "视频2"; category: "最近观看"; thumbnail: "https://via.placeholder.com/120x180" }
        ListElement { title: "视频3"; category: "最近观看"; thumbnail: "https://via.placeholder.com/120x180" }
        ListElement { title: "视频4"; category: "最近观看"; thumbnail: "https://via.placeholder.com/120x180" }
        ListElement { title: "收藏1"; category: "我的收藏"; thumbnail: "https://via.placeholder.com/120x180" }
        ListElement { title: "收藏2"; category: "我的收藏"; thumbnail: "https://via.placeholder.com/120x180" }
        ListElement { title: "收藏3"; category: "我的收藏"; thumbnail: "https://via.placeholder.com/120x180" }
        ListElement { title: "推荐1"; category: "为你推荐"; thumbnail: "https://via.placeholder.com/120x180" }
        ListElement { title: "推荐2"; category: "为你推荐"; thumbnail: "https://via.placeholder.com/120x180" }
        ListElement { title: "推荐3"; category: "为你推荐"; thumbnail: "https://via.placeholder.com/120x180" }
        ListElement { title: "推荐4"; category: "为你推荐"; thumbnail: "https://via.placeholder.com/120x180" }
    }

    // 带分组的GridView
    GridView {
        anchors.fill: parent
        model: videoModel
        cellWidth: 120
        cellHeight: 200  // 缩略图+标题高度
        spacing: 10

        // 配置分组:按category字段分组,每个分组显示一次标题
        section {
            property: "category"
            criteria: ViewSection.FullString
            delegate: sectionDelegate
        }

        // 自定义分组标题代理
        Component {
            id: sectionDelegate
            Item {
                width: parent.width
                height: 40
                Label {
                    anchors.verticalCenter: parent.verticalCenter
                    anchors.left: parent.left
                    anchors.leftMargin: 10
                    text: section
                    font.pixelSize: 22
                    font.bold: true
                    color: "#333"
                }
            }
        }

        // 自定义视频项代理
        delegate: Item {
            width: 120
            height: 200
            Column {
                spacing: 5
                Image {
                    width: 120
                    height: 180
                    source: thumbnail
                    fillMode: Image.PreserveAspectCrop
                    radius: 8  // 圆角,模拟iPhone风格
                }
                Label {
                    width: parent.width
                    text: title
                    font.pixelSize: 14
                    color: "#555"
                    elide: Text.ElideRight
                    horizontalAlignment: Text.AlignHCenter
                }
            }
        }
    }
}

关键细节调整

如果你想要更贴近iPhone视频APP里横向滚动的分组(每个组是一排横向滚动的视频),可以稍作修改:

  • 把主容器换成ListView,每个List项对应一个分组
  • 在每个分组项里,放置一个横向的GridView或ListView来展示组内的视频
  • 这样整体纵向滚动,每个分组内部横向滚动,完全复刻iPhone的交互

比如核心结构可以改成这样:

ListView {
    anchors.fill: parent
    model: ["最近观看", "我的收藏", "为你推荐"]
    delegate: Column {
        width: parent.width
        Label { /* 分组标题 */ }
        GridView { 
            width: parent.width
            height: 200
            flow: GridView.FlowLeftToRight
            // 绑定对应分组的数据模型
        }
    }
}

额外优化建议

  • 给分组标题添加粘性效果(滚动时标题固定在顶部):可以用StickyHeader组件(Qt Quick Controls里的)或者自定义实现
  • 优化项的点击反馈:给delegate添加MouseArea,点击时添加缩放或高亮效果
  • 加载真实的视频缩略图时,添加占位符和加载动画,提升用户体验

内容的提问来源于stack exchange,提问作者Carlos Duarte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:03:58