QStandardItemModel库的详细介绍

QStandardItemModel 是 PyQt5 中用于管理结构化数据(如列表、表格、树形结构)的核心模型类(属于 PyQt5.QtGui 模块)。它通过 QStandardItem 对象存储数据,并与视图组件(如 QTreeViewQTableView)无缝集成,支持动态增删、数据修改和多角色数据存储。以下是详细说明:

1. ​核心功能

  • 数据管理:存储树形、列表或表格结构的数据。
  • 视图集成:为 QTreeViewQTableViewQListView 提供数据源。
  • 信号通知:数据变化时自动通知视图更新。
  • 表头支持:自定义水平和垂直表头标签。
  • 角色扩展:通过 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. ​与其他模型的对比

QStandardItemModelQAbstractItemModel
提供现成的数据管理方法需要子类化并实现所有抽象方法
适合快速开发和小型数据集适合大型数据或自定义逻辑
直接操作 QStandardItem需要手动管理数据存储和索引

9. ​注意事项

  1. 性能问题
    当数据量较大(如超过 10,000 项)时,QStandardItemModel 可能效率较低,建议改用 QAbstractItemModel 或分页加载。

  2. 内存管理
    删除模型或项时,确保没有外部引用,避免内存泄漏。

  3. 表头自定义
    可通过 setHeaderData 和 headerData 方法动态修改表头内容。

  4. 数据角色
    使用 Qt.UserRole 及以上角色存储自定义数据,避免与内置角色冲突。


10. ​总结

  • 适用场景:快速构建树形、列表或表格界面,适合中小型数据管理和原型开发。
  • 核心优势:与 QStandardItem 深度集成,支持动态数据操作和自动视图更新。
  • 进阶建议:复杂场景下结合自定义模型或数据库优化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值