1. QListView 概述
- 用途:用于显示列表数据(单列),基于 Model/View 架构,支持自定义数据模型和视图样式。
- 与 QListWidget 的区别 :
QListWidget是封装好的便捷类(基于QListView+QStandardItemModel),适合简单场景。QListView更灵活,允许自定义模型(如QAbstractItemModel),适合复杂数据或性能敏感场景。
2. 创建与基本使用
基本步骤:
-
设置模型 :绑定数据模型(如
QStandardItemModel、QStringListModel或自定义模型)。cppQStandardItemModel *model = new QStandardItemModel(this); QListView *listView = new QListView(this); listView->setModel(model); // 添加数据项 model->appendRow(new QStandardItem("Item 1")); model->appendRow(new QStandardItem("Item 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()自定义绘制逻辑。cppclass CustomDelegate : public QStyledItemDelegate { public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override { // 自定义绘制代码 } }; // 设置委托 listView->setItemDelegate(new CustomDelegate); -
样式表:使用 Qt 样式表调整外观。
cpplistView->setStyleSheet("QListView::item { color: red; }");
5. 交互与事件
选择与操作:
-
获取选中项:
cppQModelIndexList selected = listView->selectionModel()->selectedIndexes(); for (const QModelIndex &index : selected) { QString text = index.data(Qt::DisplayRole).toString(); } -
响应双击事件:
cppconnect(listView, &QListView::doubleClicked, [](const QModelIndex &index) { qDebug() << "双击项:" << index.data(); });
拖放支持:
-
启用拖放:
cpplistView->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 和模型/视图框架,可以高效实现复杂的列表交互需求。