summer:
Qt中的 QListView 和 QTableView 都是用于显示数据的视图控件,但它们在显示方式和适用场景上有明显区别:
核心区别对比
| 特性 | QListView | QTableView |
|---|---|---|
| 显示维度 | 单列列表(一维) | 多列表格(二维) |
| 数据模型 | 使用列表模型 | 使用表格模型 |
| 布局 | 垂直或水平列表 | 行和列的网格 |
| 选择模式 | 单行选择为主 | 单元格、行、列多种选择 |
| 典型用途 | 简单列表、图标视图 | 结构化数据展示 |
QListView 使用场景
适合场景:
-
简单列表显示
cpp
// 文件列表、用户列表、选项列表
QStringListModel *model = new QStringListModel;
model->setStringList({"项目1", "项目2", "项目3"});
QListView *listView = new QListView;
listView->setModel(model);
图标视图
cpp
listView->setViewMode(QListView::IconMode);
listView->setIconSize(QSize(64, 64));
单选或多选列表
cpp
listView->setSelectionMode(QAbstractItemView::SingleSelection);
// 或 QAbstractItemView::MultiSelection
-
导航菜单
-
侧边栏菜单
-
设置选项列表
-
目录树(结合QTreeView更佳)
-

QTableView 使用场景
适合场景:
-
表格数据展示
cpp
QStandardItemModel *model = new QStandardItemModel(3, 3);
model->setHorizontalHeaderLabels({"姓名", "年龄", "部门"});
QTableView *tableView = new QTableView;
tableView->setModel(model);
可编辑的数据表格
cpp
tableView->setEditTriggers(QAbstractItemView::DoubleClicked |
QAbstractItemView::SelectedClicked);
需要行列操作的场景
cpp
// 调整列宽
tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// 排序
tableView->setSortingEnabled(true);
-
复杂数据展示
-
数据库查询结果
-
Excel风格的数据表
-
统计报表
-
选择建议
使用 QListView 当:
-
只需要显示一列数据
-
数据项较为简单(文本+图标)
-
用作导航或选择器
-
需要图标视图模式
-
性能要求较高(显示大量简单项时更高效)
使用 QTableView 当:
-
需要显示多列结构化数据
-
数据有明确的行列关系
-
需要单元格级别的编辑
-
需要排序、筛选功能
-
需要表头操作(列排序、隐藏列等)
代码示例对比
QListView 示例:
cpp
// 创建列表视图
QListView *listView = new QListView(this);
QStringListModel *listModel = new QStringListModel(this);
listModel->setStringList(QStringList() << "苹果" << "香蕉" << "橙子");
listView->setModel(listModel);
listView->setSelectionMode(QAbstractItemView::ExtendedSelection);
QTableView 示例:
cpp
// 创建表格视图
QTableView *tableView = new QTableView(this);
QStandardItemModel *tableModel = new QStandardItemModel(3, 2, this);
tableModel->setHorizontalHeaderLabels({"水果", "价格"});
tableModel->setItem(0, 0, new QStandardItem("苹果"));
tableModel->setItem(0, 1, new QStandardItem("5.0"));
tableView->setModel(tableModel);
tableView->horizontalHeader()->setStretchLastSection(true);

共同特性
两个控件都:
-
基于 Model/View 架构
-
支持自定义委托(delegate)
-
支持样式表定制
-
支持拖放操作
-
可连接到相同的数据模型(但显示效果不同)
性能考虑
-
QListView对于大量简单项通常性能更好 -
QTableView在处理大型表格时可能需要虚拟化或分页
选择时主要根据数据的维度和结构来决定使用哪个控件。