Qt QListView总结

1. QListView 概述

  • 用途:用于显示列表数据(单列),基于 Model/View 架构,支持自定义数据模型和视图样式。
  • 与 QListWidget 的区别
    • QListWidget 是封装好的便捷类(基于 QListView + QStandardItemModel),适合简单场景。
    • QListView 更灵活,允许自定义模型(如 QAbstractItemModel),适合复杂数据或性能敏感场景。

2. 创建与基本使用

基本步骤
  1. 设置模型 :绑定数据模型(如 QStandardItemModelQStringListModel 或自定义模型)。

    cpp 复制代码
    QStandardItemModel *model = new QStandardItemModel(this);
    QListView *listView = new QListView(this);
    listView->setModel(model);
    
    // 添加数据项
    model->appendRow(new QStandardItem("Item 1"));
    model->appendRow(new QStandardItem("Item 2"));
  2. 数据绑定:通过模型管理数据,视图自动更新。


3. 常用属性与方法

属性
  • setViewMode():设置视图模式(如 ListModeIconMode)。
  • setMovement():控制项是否可拖动(StaticFreeSnap)。
  • setResizeMode():调整项大小策略(FixedAdjust)。
  • setSelectionMode():选择模式(单选 SingleSelection、多选 ExtendedSelection 等)。
  • setEditTriggers():编辑触发方式(如双击编辑 DoubleClicked)。
方法
  • setModel():绑定数据模型。
  • selectionModel():获取选择模型,用于操作选中项。
  • scrollTo():滚动到指定项。

4. 显示与样式

自定义项外观
  • 委托(Delegate) :通过继承 QStyledItemDelegate 重写 paint()sizeHint() 自定义绘制逻辑。

    cpp 复制代码
    class CustomDelegate : public QStyledItemDelegate {
    public:
        void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override {
            // 自定义绘制代码
        }
    };
    
    // 设置委托
    listView->setItemDelegate(new CustomDelegate);
  • 样式表:使用 Qt 样式表调整外观。

    cpp 复制代码
    listView->setStyleSheet("QListView::item { color: red; }");

5. 交互与事件

选择与操作
  • 获取选中项

    cpp 复制代码
    QModelIndexList selected = listView->selectionModel()->selectedIndexes();
    for (const QModelIndex &index : selected) {
        QString text = index.data(Qt::DisplayRole).toString();
    }
  • 响应双击事件

    cpp 复制代码
    connect(listView, &QListView::doubleClicked, [](const QModelIndex &index) {
        qDebug() << "双击项:" << index.data();
    });
拖放支持
  • 启用拖放:

    cpp 复制代码
    listView->setDragEnabled(true);
    listView->setAcceptDrops(true);
    listView->setDropIndicatorShown(true);

6. 信号与槽

  • 常用信号
    • clicked(const QModelIndex &index):点击项时触发。
    • doubleClicked(const QModelIndex &index):双击项时触发。
    • activated(const QModelIndex &index):项被激活(如回车键)。

7. 性能优化

  • 大数据量优化
    • 使用 QStringListModel 或自定义模型实现懒加载。
    • 启用视图的 setUniformItemSizes(true) 提升渲染效率。
  • UI优化:避免在委托中执行复杂绘制,禁用不必要的动画。

8. 常见使用场景

  • 文件列表展示
  • 日志信息显示
  • 配置项选择
  • 聊天消息列表

9. 示例代码

cpp 复制代码
// 创建模型和视图
QStringListModel *model = new QStringListModel(this);
QListView *listView = new QListView(this);
listView->setModel(model);

// 添加数据
QStringList data = {"Apple", "Banana", "Cherry"};
model->setStringList(data);

// 设置选择模式
listView->setSelectionMode(QAbstractItemView::ExtendedSelection);

// 响应选择变化
connect(listView->selectionModel(), &QItemSelectionModel::selectionChanged, [=]() {
    qDebug() << "选中项数量:" << listView->selectionModel()->selectedIndexes().size();
});

注意事项

  • 避免直接操作视图数据,应通过模型接口修改数据。
  • 自定义委托时需注意内存管理和性能影响。
  • 处理大数据时优先考虑分页或懒加载。

通过灵活使用 QListView 和模型/视图框架,可以高效实现复杂的列表交互需求。

相关推荐
ytttr8738 小时前
64QAM信号的数字预失真处理(MATLAB实现)
开发语言·matlab
Nebula_g8 小时前
C语言应用实例:硕鼠游戏,田忌赛马,搬桌子,活动选择(贪心算法)
c语言·开发语言·学习·算法·游戏·贪心算法·初学者
爱吃甜品的糯米团子8 小时前
详解 JavaScript 内置对象与包装类型:方法、案例与实战
java·开发语言·javascript
QT 小鲜肉8 小时前
【Git、GitHub、Gitee】按功能分类汇总Git常用命令详解(超详细)
c语言·网络·c++·git·qt·gitee·github
郝学胜-神的一滴8 小时前
Linux下,获取子进程退出值和异常终止信号
linux·服务器·开发语言·c++·程序人生
AI科技星9 小时前
张祥前统一场论动量公式P=m(C-V)误解解答
开发语言·数据结构·人工智能·经验分享·python·线性代数·算法
CodeByV9 小时前
【C++】继承
开发语言·c++
权泽谦9 小时前
用 Python 做一个天气预报桌面小程序(附源码 + 打包与部署指导)
开发语言·python·小程序
ftpeak9 小时前
《Rust+Slint:跨平台GUI应用》第八章 窗体
开发语言·ui·rust·slint
森语林溪10 小时前
大数据环境搭建从零开始(十七):JDK 17 安装与配置完整指南
java·大数据·开发语言·centos·vmware·软件需求·虚拟机