Qt QListView总结

1. QListView 概述

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

2. 创建与基本使用

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

    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():设置视图模式(如 ListMode 或 IconMode)。
  • setMovement():控制项是否可拖动(Static、Free、Snap)。
  • setResizeMode():调整项大小策略(Fixed、Adjust)。
  • 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 和模型/视图框架,可以高效实现复杂的列表交互需求。

相关推荐
释厄62328 分钟前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin
2601_9628857239 分钟前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python
临床数据科学和人工智能兴趣组1 小时前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1
蜗牛互联网1 小时前
Python调用Gemini Structured Outputs实现工单路由门禁
java·开发语言·人工智能·python
SEO_juper1 小时前
给网页做可引用性评分:判断内容够不够让 AI 引用(GEO 工具,附代码)
开发语言·人工智能·爬虫·python·seo·独立站
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 产品定位、功能模块与客户端原型解读
java·开发语言·交友
盛世宏博北京2 小时前
十二防档案库房总线架构设计:恒湿消毒净化一体机 RS485 组网实战笔记
开发语言·笔记·php·恒湿机·档案八防温湿度
雪雪爱冲浪2 小时前
JavaScript 网络爬虫教程(2026)
开发语言·javascript·爬虫
要吃这碗饭2 小时前
JavaScript 网络爬虫教程(2026)
开发语言·javascript·爬虫
czq_26867194872 小时前
Python打卡第40天
开发语言·python