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