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 和模型/视图框架,可以高效实现复杂的列表交互需求。

相关推荐
paterWang1 小时前
基于 Python 和 OpenCV 的酒店客房入侵检测系统设计与实现
开发语言·python·opencv
东方佑2 小时前
使用Python和OpenCV实现图像像素压缩与解压
开发语言·python·opencv
我真不会起名字啊2 小时前
“深入浅出”系列之杂谈篇:(3)Qt5和Qt6该学哪个?
开发语言·qt
laimaxgg2 小时前
Qt常用控件之单选按钮QRadioButton
开发语言·c++·qt·ui·qt5
牵牛老人2 小时前
Qt中使用QPdfWriter类结合QPainter类绘制并输出PDF文件
数据库·qt·pdf
水瓶丫头站住3 小时前
Qt的QStackedWidget样式设置
开发语言·qt
小钊(求职中)4 小时前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
慕诗客5 小时前
QT基于Gstreamer采集的简单示例
开发语言·qt
Blasit5 小时前
C++ Qt建立一个HTTP服务器
服务器·开发语言·c++·qt·http
Victoria.a5 小时前
数组和指针常见笔试题(深度剖析)
c语言·开发语言