QStandardItemModel
是 PyQt5 中用于管理结构化数据(如列表、表格、树形结构)的核心模型类(属于 PyQt5.QtGui
模块)。它通过 QStandardItem
对象存储数据,并与视图组件(如 QTreeView
、QTableView
)无缝集成,支持动态增删、数据修改和多角色数据存储。以下是详细说明:
1. 核心功能
- 数据管理:存储树形、列表或表格结构的数据。
- 视图集成:为
QTreeView
、QTableView
、QListView
提供数据源。 - 信号通知:数据变化时自动通知视图更新。
- 表头支持:自定义水平和垂直表头标签。
- 角色扩展:通过
Qt.ItemDataRole
管理文本、图标、颜色等不同数据属性。
2. 基本用法
导入模块
python
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QApplication, QTreeView, QTableView
创建模型
python
# 创建空模型
model = QStandardItemModel()
# 创建指定行列数的表格模型(4行3列)
table_model = QStandardItemModel(4, 3)
设置表头
python
# 设置水平表头标签
model.setHorizontalHeaderLabels(["姓名", "年龄", "职业"])
# 设置垂直表头标签(行号)
model.setVerticalHeaderLabels(["行1", "行2", "行3"])
关联视图
python
tree_view = QTreeView()
tree_view.setModel(model) # 模型与视图绑定
3. 数据操作
添加数据项
python
# 创建数据项
item_name = QStandardItem("张三")
item_age = QStandardItem("25")
item_job = QStandardItem("工程师")
# 添加一行数据
model.appendRow([item_name, item_age, item_job])
# 在指定位置插入行(第2行)
model.insertRow(1, [QStandardItem("李四"), QStandardItem("30"), QStandardItem("设计师")])
删除数据项
python
# 删除第0行
model.removeRow(0)
# 清空所有数据
model.clear()
获取数据项
python
# 获取第0行第1列的项
item = model.item(0, 1)
if item:
print(item.text()) # 输出文本内容
4. 层级结构(树形数据)
通过 QStandardItem
的父子关系构建树形结构:
python
# 创建根项
root_item = model.invisibleRootItem()
# 创建父项
parent = QStandardItem("部门A")
root_item.appendRow(parent)
# 添加子项
child = QStandardItem("员工1")
parent.appendRow(child)
5. 信号与事件
当模型数据变化时,触发以下信号:
- itemChanged:项的数据被修改。
- rowsInserted / rowsRemoved:行增删时触发。
- dataChanged:项的数据或角色变化时触发。
监听数据变化
python
def on_item_changed(item):
print(f"数据变化:{item.text()}")
model.itemChanged.connect(on_item_changed)
6. 与 QStandardItem 的协作
QStandardItemModel
通过 QStandardItem
存储具体数据,支持以下操作:
- 多角色数据:利用
setData(value, role)
存储文本、图标、自定义数据等。 - 复选框:启用
setCheckable(True)
,通过checkState()
获取状态。 - 图标和样式:设置字体、颜色、背景等。
7. 示例代码
表格数据展示
python
from PyQt5.QtWidgets import QApplication, QTableView
from PyQt5.QtGui import QStandardItemModel, QStandardItem
app = QApplication([])
# 创建模型并设置表头
model = QStandardItemModel(3, 2)
model.setHorizontalHeaderLabels(["名称", "值"])
# 填充数据
for row in range(3):
for col in range(2):
item = QStandardItem(f"行{row}, 列{col}")
model.setItem(row, col, item)
# 显示表格
table_view = QTableView()
table_view.setModel(model)
table_view.resize(400, 300)
table_view.show()
app.exec_()
树形数据展示
python
from PyQt5.QtWidgets import QTreeView
model = QStandardItemModel()
root = model.invisibleRootItem()
# 添加父项和子项
parent = QStandardItem("项目")
parent.appendRow([QStandardItem("任务1"), QStandardItem("进行中")])
parent.appendRow([QStandardItem("任务2"), QStandardItem("已完成")])
root.appendRow(parent)
# 显示树形视图
tree_view = QTreeView()
tree_view.setModel(model)
tree_view.expandAll() # 展开所有节点
tree_view.show()
app.exec_()
8. 与其他模型的对比
QStandardItemModel | QAbstractItemModel |
---|---|
提供现成的数据管理方法 | 需要子类化并实现所有抽象方法 |
适合快速开发和小型数据集 | 适合大型数据或自定义逻辑 |
直接操作 QStandardItem | 需要手动管理数据存储和索引 |
9. 注意事项
-
性能问题:
当数据量较大(如超过 10,000 项)时,QStandardItemModel
可能效率较低,建议改用QAbstractItemModel
或分页加载。 -
内存管理:
删除模型或项时,确保没有外部引用,避免内存泄漏。 -
表头自定义:
可通过setHeaderData
和headerData
方法动态修改表头内容。 -
数据角色:
使用Qt.UserRole
及以上角色存储自定义数据,避免与内置角色冲突。
10. 总结
- 适用场景:快速构建树形、列表或表格界面,适合中小型数据管理和原型开发。
- 核心优势:与
QStandardItem
深度集成,支持动态数据操作和自动视图更新。 - 进阶建议:复杂场景下结合自定义模型或数据库优化性能。