标准数据模型QStandardltemModel
标准数据模型QStandardItemModel可以存储多行多列的数据
- 表格数据表格中的每个数据称为数据项QStandardItem
- 每个数据项下面还可以存储多行多列的子数据表格并形成层级关系,这样会形成比较复杂的结构关系。数据项可以存储文本、图标勾选状态等信息。
用QStandardItemModel创建标准数据模型的方法如下所示其中parent是QObject或继承自QObject的实例对象,rows 和columns 分别是行数和列数
用QStandardItem创建数据项的方法如下所示用QStandardItem(rows,columns)方法可以创建一个含有多行多列子数据项的数据项。
from PySide6.QtGui import QStandardItemModel,QStandardItem
QStandardItemModel(parent: Union[PySide6.QtCore.QObject,NoneType]= None)-> None
QStandardItemModel(rows: int,columns: int,parent: Union[PySide6.QtCore.QObject,NoneType]= None)-> None
QStandardItem(self)-> None
QStandardItem(icon: Union[PySide6.QtGui.QIcon,PySide6.QtGui.QPixmap],text: str)-> None
QStandardItem(Other: PySide6.QtGui.QStandardItem)-> None
QStandardItem(rows: int,columns: int = 1)-> None
QStandardItem(text: str)-> None
标准数据模型QStandardItemModel的常用方法
标准数据模型QStandardItemModel的常用方法如表所示,主要方法介绍如下标
- 准数据模型最高层的列数和行数用setColumnCount(columns:int)和setRowCount(row;int)方法设置;
- 用columnCount(parent: QModelIndex)方法和rowCount(parent:QModelIndex)方法可获得某层的列数和行数。
- 用appendColumn(Sequence[QStandardItem])方法可以添加列;
- 用appendRow(Sequence[QStandardItem])方法或appendRow(QStandardItem)方法可添加行
- 用insertColumn(Sequence[QStandardItem])方法和insertRow(Sequence[QStandardItem])方法插人列行;
- 用takeColumn(column:int)方法和 takeRow(row:int)方法移除列和行。
- 用setItem(row;int,column;int,item;QStandardItem)方法或 setItem(row; int,item:QStandardItem)方法可以在数据模型中设置数据项,
- 用item(row:int,column:int=0)方法可以获取数据项,
- 用takeltem(row:int,column:int=0)方法可移除数据项,
- 用clear()方法可清除所有的数据项。
- 用setData(QModelIndex,Any,role =Qt EditRole)方法和setItemData(QModelIndex,Dict[int,Any])方法可以设置数据项的角色数据,
- 用clearItemData(QModelIndex)方法可以清除数据项上的角色数据。
- 获得数据项的索引
- index(row:int,column:int,parent: QModelIndex)
- indexFromItem(QStandardItem)
- sibling(row:int,column:int,idx:QModelIndex)
- 标准数据模型有行表头和列表头
- 用setHorizontalHeaderItem(column:int,item:QStandardItem)方法和 setVerticalHeaderItem(row;int,item: QStandardItem)方法设置水平表头和竖直表头的数据项;
- 用takeHorizontalHeaderItem(column;int)方法和takeVerticalHeaderItem(row;int)方法移除表头的数据项,并返回被移除的表头数据项。
QStandardItemModel的方法及参数类型 | 返回值的类型 | 说明 |
---|---|---|
removeRows(row:int,count:int,parent: QModelIndex) | bool | 移除多行 |
setltem(row: int,column: int,item: QStandardItem) | None | 根据行和列设置项 |
setltem(row: int,item: QStandardItem) | None | 根据行设置数据项 |
item(row: int,column: int=0) | QStandardItem | 根据行和列获取项 |
takeltem(row: int,column: int=0) | QStandardItem | 移除数据项 |
setData(QModelIndex,Any,role = Qt.EditRole) | bool | 设置角色值 |
data(QModellndex,role=Qt.DisplayRole) | Any | 获取角色值 |
setItemData(QModelIndex,Dict[int,Any]) | bool | 用字典设置项的值 |
itemData(QModelIndex) | Dict[int,Any] | 获取多个项的值 |
setHeaderData(int,Qt.Orientation,Any,role= Qt.EditRole) | bool | 设置表头值 |
headerData(int,Qt.Orientation,role=Qt.DisplayRole) | Any | 获取表头的值 |
setHorizontalHeaderltem(column: int,QStandardItem) | None | 设置水平表头的项 |
setHorizontalHeaderLabels(labels: Sequence[str]) | None | 设置水平表头的文本内容 |
horizontalHeaderItem(column:int) | QStandardItem | 获取水平表头的项 |
setVerticalHeaderItem(row: int,item: QStandardItem) | None | 设置竖直表头的项 |
setVerticalHeaderLabels(labels: Sequence[str]) | None | 设置竖直表头的文本内容 |
verticalHeaderItem(row: int) | QStandardItem | 获取竖直表头的项 |
takeHorizontalHeaderItem(coloumn:int) | QStandardItem | 移除水平表头的项 |
takeVerticalHeaderItem(row:int) | QStandardItem | 移除竖直表头的项 |
index(row: int,column: int,parent: QModelIndex) | QModelIndex | 根据行列获取数据项索引 |
indexFromItem(QStandardItem) | QModelIndex | 根据项获取索引 |
sibling(row: int,column: int,idx: QModelIndex) | QModelIndex | 获取同级别的索引 |
invisiblerootItem() | QStandardItem | 获取根目录的项 |
clear() | None | 清除所有的数据项 |
clearItemData(index: QModelIndex) | bool | 清除项中的数据 |
findItems(str,Qt.MatchFlag,column=0) | List[QStandardItem] | 获取满足匹配条件的数据项列表 |
flags(QModelIndex) | Qt.ItemFlags | 获取数据项的标识 |
hasChildren(parent:QModelIndex) | bool | 获取是否有子项 |
itemFromIndex(QModelIndex) | QStandardItem | 根据索引获取项 |
parent(child: QModelIndex) | QModelIndex | 获取父项的索引 |
setSortRole(role:int) | None | 设置排序角色 |
sortRole() | int | 获取排序角色 |
sort(column:int,order=Qt.AscendingOrder) | None | 根据角色值排序 |
数据项QStandardItem的常用方法
数据项QStandardItem的常用方法如表所示,主要方法介绍如下
- 数据项可以设置文本、字体、图标、前景色、背景色勾选状态和提示信息等。
- 用setText(str)方法设置数据项显示的文本;
- 用setIcon(QIcon)方法设置图标;
- 用setFont(QFont)方法设置数据项的字体;
- 用setForeground(QColor)方法设置前景色;
- 用setCheckable(bool)方法设置是否可以勾选,
- 用setCheckState(Qt.CheckState)方法设置勾选状态
- 数据项下面可以有多行多列子数据项
- 行和列可以在创建数据项时用构造函数设置,
- 也可用setRowCount(int)方法和 setColumnCount(int)方法设置;
- 用rowCount()方法和columnCount()方法获取行和列的数量。
- 可用多种方法添加插入和移除子数据项的行和列,
- 用setChild(row:int,column;int,QStandardItem)方法和setChild(row:intQStandardItem)方法设置子数据项;
- 用row()和column()方法获取数据项所在的行和列;
- 用child(row:int,column;int=0)方法获取子数据项;
- 用hasChildren()方法获取是否有子数据项;
- 用takeChild(row:int;column:int-0)方法移除子数据项,并返回被移除的子数据项。
QStandardltem的方法及参数类型 | 返回值的类型 | 说 明 |
---|---|---|
index() | QModelIndex | 获取数据项的索引 |
setColumnCount(int) | None | 设置列数 |
columnCount() | Int | 获取列数 |
setRowCount(int) | None | 设置行数 |
rowCount() | int | 获取行数 |
setChild(row: int.column:int,QStandardltem) | None | 根据行和列设置子数据项 |
setChild(row:int,QStandardItem) | None | 根据行设置子数据项 |
hasChildren() | bool | 获取是否有子数据项 |
child(row: int,column: int=0) | QStandardItem | 根据行和列获取子数据项 |
takeChild(row: int,column:int=0) | QStandardltem | 移除并返回子数据项 |
row()、column() | int | 获取数据项所在的行和列 |
appendColumn(Sequence[QStandardItern.]) | None | 添加列 |
appendRow(Sequence[QStandardItem]) | None | 添加行 |
appendRow(QStandardItem) | None | 添加行 |
appendRows(Sequence[QStandardItem]) | None | 添加多行 |
insertColumn(column:int,Sequence[QStandardItem]) | None | 插人列 |
insertColumns(column: int,count:int) | None | 插人多列 |
insertRow(row: int,Sequence[QStandardItem]) | None | 插人行 |
insertRow(row:int,QStandardItem) | None | 插人行 |
insertRows(row:int,count:int) | None | 插人多行 |
insertRows(row:int,Sequence[QStandardItem]) | None | 插人多行 |
removeColumn(column:int) | None | 移除列 |
removeColumns(column: int,count: int) | None | 移除多列 |
removeRow(row:int) | None | 移除行 |
removeRows(row:int,count:int) | None- | 移除多行 |
takeColumn(column:int) | List[QStandardItem] | 移除列,并返回被移除的数据项列表 |
takeRow(row:int) | List[QStandardItem] | 移除行,并返回被移除的数据项列表 |
model() | QStandardItemModel | 获取数据模型 |
parent() | QStandardItem | 获取父数据项 |
setAutotristate(bool) | None | 设置自动有第3种状态 |
isAutotristate() | bool | 获取自动有第3种状态 |
setTristate(bool) | None | 设置是否有弟3种状态 |
setForeground(brush: Union[QBrush,Qt.BrushStyle,Qt.GlobalColor,QColor,QGradient,QImage,QPixmap]) | None | 设置前景色 |
foreground() | QBrush | .获取前景画刷 |
setBackground(brush: Union[QBrush,Qt.BrushStyle,Qt.GlobalColor,QColor:QGradient,QImage,QPixmap]) | None | 设置背景色 |
background() | QBrush | 获取背景画刷 |
setCheckable(bool) | None | 设置是否可以勾选 |
setCheckState(Qt.CheckState) | None | 设置勾选状态 |
checkState() | Qt.CheckState | 获取勾选状态 |
isCheckable() | bool | 获取是否可以勾选 |
setData(value: Any,role: int=257) | None | 设置数据 |
data(role:int=257) | Any | 获取数据 |
clearData() | None | 清空数据 |
setDragEnabled(bool) | None | 设置是否可以拖拽 |
isDragEnabled() | bool | 获取是否可以拖拽 |
setDropEnabled(bool) | None | 设置是否可以拖放 |
isDropEnabled() | bool | 获取是否可以拖放 |
setEditable(bool) | None | 设置是否可以编辑 |
setEnabled(bool) | None | 设置是否激活 |
setFlags(Qt.ItemFlag) | None | 设置标识 |
isEditable() | bool | 获取是否可编辑 |
isEnabled() | bool | 获取是否激活 |
isSelectable() | bool | 获取是否可选择 |
isUserTristate() | bool | 获取是否有用户第3状态 |
setFont(QFont) | None | 设置字体 |
setIcon(QIcon) | None | 设置图标 |
setSelectable(bool) | None | 设置选中状态 |
setStatusTip(str) | None | 设置状态信息 |
setText(str) | None | 设置文本 |
text() | str | 欢取文本 |
setTextAlignment(Qt.Alignment) | None | 设置文本对齐方式 |
setToolTip(str) | None | 设置提示信息 |
setWhatsThis(str) | None | 设置按Shilt+F1键的提示信息 |
write(QDataStream) | None | 把项写人到数据流中 |
read(QDataStream) | None | 从数据流中读取项 |
sortChildren(column:int,order = Qt.AscendingOrder) | None | 对列进行排序 |
基于item的操作
针对item的常规操作可以使用函数 setText()、setIcon()、setFont()、setForeground()和setBackground()等,可以参考 QListWidget 的相关内容。
可以使用setItem(row,column,item)将 item 插入表中,使用 takeitem(row,column)可以删除item。代码如下:
item = OStandardItem('testItem')
self.model.setItem(row,column,item)
有时候需要合并单元格,这就需要使用 setSpan()函数,用法和举例如下:
# 合并单元格
self.tableview.setSpan(1,0,1,2)
item = QStandardItem(合并单元格)
item.setTextAlignment(Qt.AlignCenter)
self.model.setItem(1,0,item)
角色
一个项目可以有多重角色,对于 item,可以使用函数 setText()、setIcon()、setForeground()等设置 DisplayRole、DecorationRole、ForegroundRole 等角色
这些item的函数使用角色也能实现,举例如下:
item = QStandardItem(value)
item.setData(QColor(155,14,0),role=Qt.ForegroundRole)
item.setData(value+'-toolTip',role=Qt.ToolTipRole)
item.setData(QIcon("images/open.png"),role=Qt.DecorationRole)
self.model.setItem(row,column,item)
model也有 setData0函数,可以实现相同的功能,举例如下:
self.model.setData(self.model.index(4,0),
QColor(215,214220),
role=Qt.BackgroundRole)
行/列操作使用函数
insertRow()、insertColumn()、removeRow()、removeColumn()可以增加或删除行/列。
-
使用rowCount()函数可以获取表格的行数
-
使用columnCount()函数可以获取表格的列数
-
使用clear0函数可以清空表格
-
使用fndItems()函数可以搜索模型中的项目
-
使用sort()函数可以对模型进行排序。