24. 基于项的控件

news/2025/1/12 18:54:56/文章来源:https://www.cnblogs.com/FlurryHeart/p/18667168

一、基于项的控件

  PySide6 有专门的显示数据的控件和存储数据的模型,可以显示和存储不同形式的数据。显示数据的控件分为两类,一类是基于 (item)的控件,另一类是基于 模型(model)的控件,基于项的控件是基于模型的控件的简便类。基于项的控件把读取到的数据存储到项中,基于模型的控件把数据存储到模型中,或通过模型提供读取数据的接口,然后通过控件把数据模型中的数据或关联的数据显示出来。

  我们可以在终端中使用 pip 安装 pyside6 模块。

pip install pyside6

  基于项的控件有 列表控件 QListWidget、表格控件 QTableWidget和 树结构控件 QTreeWidget,它们是从基于模型的控件继承而来的,基于模型的控件有 QListView、QTableView 和 QTreeView,这些控件之间的继承关系如下所示。

基于项和模型控件的继承关系

  QAbstractItemView 类的常用方法:

# 实例方法
setModel(model:QAbstractItemModel) -> None                          # 设置数据模型
setSelectionModel(selectionModel:QItemSelectionModel) -> None       # 设置选择模型
setAlternatingRowColors(enable:bool) -> None                        # 设置交替色# 槽方法
clearSelection() -> None                                            # 清空选择

二、列表控件及其项

  列表控件 QListWidget 由一列多行构成,每行称为一个项(item),每个项是一个 QListWidgetItem 对象。可以继承 QListWidgetItem 创建用户自定义的项,也可以先创建 QWidget 实例,在其上添加一些控件,然后把 QWidget 放到 QListWidgetItem 的位置,形成复杂的列表控件。

  列表控件 QListWidget 是从 QListView 类继承而来的,用 QListWidget 类创建列表控件的方法如下所示:

QListWidget(parent:QWidget=None)

  其中 parent 是 QListWidget 列表控件所在的父窗口或控件。

  用 QListWidgetItem 创建列表项的方法如下所示:

QListWidgetItem(listview:QListWidget=None, type:int=QListWidgetItem.Type)
QListWidgetItem(text:str, listview:QListWidget=None, type:int=QListWidgetItem.Type)
QListWidgetItem(icon:Union[QIcon, QPixmap], text:str, listview:QListWidget=None, type:int=QListWidgetItem.Type)

  其中 type 可取 QListWidgetItem.Type(值为 0)或 QListWidgetItem.UserType(值为 1000),前者是默认值,后者是用户自定义类型的最小值。可以用 QListWidgetItem 类创建子类,定义新的类型。

  列表控件 QListWidget 的常用方法如下:

# 实例方法
addItem(item:QListWidgetItem) -> None                                                           # 在列表控件中添加项
addItem(label:str) -> None                                                                      # 用文本创建并添加项
addItems(labels:Sequence[str]) -> None                                                          # 用文本列表创建添加多个项insertItem(row:int, item:QListWidgetItem) -> None                                               # 在列表控件中插入项
insertItem(row:int, label:str) -> None                                                          # 用文本创建项并插入项
insertItems(row:int, labels:Sequence[str]) -> None                                              # 用文本列表创建项并插入多个项setCurrentItem(item:QListWidgetItem) -> None                                                    # 设置当前项
currentItem() -> QListWidgetItem                                                                # 返回当前项
setCurrentRow(row:int) -> None                                                                  # 指定第row行为当前行
currentRow() -> int                                                                             # 返回当前行selectedItems() -> List[QListWidgetItem]                                                        # 返回选择项的列表row(item:QListWidgetItem) -> int                                                                # 返回当前项的行号
item(row:int) -> QListWidgetItem                                                                # 返回指定行的项
itemAt(p:QPoint) -> QListWidgetItem                                                             # 返回指定位置的项
itemAt(x:int, y:int) -> QListWidgetItem                                                         # 返回指定位置的项itemFromIndex(index:QModelIndex) -> QListWidgetItem                                             # 返回指定索引的项
visualItemRect(item:QListWidgetItem) -> QRect                                                   # 返回指定项的矩形setItemWidget(item:QListWidgetItem, widget:QWidget) -> None                                     # 把某控件显示在指定项的位置处
itemWidget(item:QListWidgetItem) -> QWidget                                                     # 返回指定项位置处的控件
removeItemWidget(item:QListWidgetItem) -> None                                                  # 删除指定项位置处的控件openPersistentEditor(item:QListWidgetItem) -> None                                              # 打开指定项的编辑框,用于编辑文本
isPersistentEditorOpen(item:QListWidgetItem) -> bool                                            # 返回指定项的编辑框是否打开
closePersistentEditor(item:QListWidgetItem) -> None                                             # 关闭指定项的编辑框count() -> int                                                                                  # 返回项的数量
takeItem(row:int) -> QListWidgetItem                                                            # 从列表控件中删除并返回项
findItems(text:str, flags:Qt.MatchFlags) -> List[QListWidgetItem]                               # 返回匹配项的列表setSortingEnabled(enable:bool) -> None                                                          # 设置列表控件是否可以排序
isSortingEnabled() -> bool                                                                      # 返回列表控件是否可以排序
sortItems(order:Qt.SortOrder=Qt.AscendingOrder) -> None                                         # 按照排序方式进行项的排序supportedDropActions() ->  Qt.DropActions                                                       # 返回列表控件支持的拖动和粘贴操作mimeData(items:Sequence[QListWidgetItem]) -> QMimeData                                          # 获取多个项的mime数据QMimeData
mimeTypes() -> List[str]                                                                        # 返回mime数据的类型列表# 槽方法                  
clear() -> None                                                                                 # 清空列表控件
scrollToItem(item:QListWidgetItem, hint=QAbstractItemView.ScrollHint.EnsureVisible) -> None     # 滚动到指定项,使其可见

  用 setSortingEnabled(bool) 方法设置是否可以进行排序;用 sortItems(order=Qt.AscendingOrder) 方法设置排序方法,其中 order 可取值如下:

Qt.AscendingOrder.AscendingOrder     # 升序
Qt.AscendingOrder.DescendingOrder    # 降序

  用 findItems(text:str,flags:Qt.MatchFlags) 方法可以查找满足匹配规则的项 List[QListWidgetItem],其中参数 flags 可取值如下:

Qt.MatchFlags.MatchExactly
Qt.MatchFlags.MatchFixedString
Qt.MatchFlags.MatchContains
Qt.MatchFlags.MatchStartsWith
Qt.MatchFlags.MatchEndsWith
Qt.MatchFlags.MatchCaseSensitive
Qt.MatchFlags.MatchRegularExpression
Qt.MatchFlags.MatchWildcard
Qt.MatchFlags.MatchWrap
Qt.MatchFlags.MatchRecursive

  用 supportedDropActions() 方法获取支持的拖放动作 Qt.DropAction,其中 Qt.DropAction 可以取值如下:

Qt.DropAction.CopyAction          # 复制
Qt.DropAction.MoveAction          # 移动
Qt.DropAction.LinkAction          # 链接
Qt.DropAction.IgnoreAction        # 什么都不做
Qt.DropAction.TargetMoveAction    # 目标对象接管

  列表控件 QListWidget 的常用信号如下:

currentItemChanged(current:QListWidgetItem, previous:QListWidgetItem)       # 当前项发生改变时发射信号
currentRowChanged(currentRow:int)                                           # 当前行发生改变时发射信号
currentTextChanged(currentText:str)                                         # 当前项的文本发生改变时发射信号
itemActivated(item:QListWidgetItem)                                         # 单击或双击项,使其变成活跃项时发射信号
itemChanged(item:QListWidgetItem)                                           # 项的数据发生改变时发射信号
itemClicked(item:QListWidgetItem)                                           # 单击项时发射信号
itemDoubleClicked(item:QListWidgetItem)                                     # 双击项时发射信号
itemEntered(item:QListWidgetItem)                                           # 光标进入某个项时发射信号
itemPressed(item:QListWidgetItem)                                           # 当鼠标在某个项按下时发射信号
itemSelectionChanged()                                                      # 项的选择状态发生改变时发射信号

  列表项 QListWidgetItem 的常用方法如下:

setText(text:str) -> None                               # 设置文字
text() -> str                                           # 获取文字
setTextAlignment(alignment:Qt.Alignment) -> None        # 设置文字对齐方式
setIcon(icon:QIcon) -> None                             # 设置图标
icon() -> QIcon                                         # 获取图标
setToolTip(toolTip:str) -> None                         # 设置提示文字
setFont(font:QFont) -> None                             # 设置字体
setForeground(brush:QColor) -> None                     # 设置前景色
setBackground(brush:QColor) -> None                     # 设置背景色
setStatusTip(statusTip:str) -> None                     # 设置状态提示文字,需激活mouseTracking属性
setWhatsThis(whatsThis:str) -> None                     # 设置按Shift+F1键的显示文字setCheckState(state:Qt.CheckState) -> None              # 设置勾选状态
checkState() -> Qt.CheckState                           # 获取勾选状态
setFlags(flags:Qt.ItemFlag) -> None                     # 设置标识
setHidden(hide:bool) -> None                            # 设置是否隐藏
isHidden() -> bool                                      # 获取是否隐藏
setSelected(select:bool) -> None                        # 设置是否选中
isSelected() -> bool                                    # 获取是否选中clone() -> QListWidgetItem                              # 克隆一个项
listWidget() -> QListWidget                             # 获取列表视图write(out:QDataStream) -> None                          # 将项写入数据流
read(in:QDataStream) -> None                            # 从数据流中读取项
setData(role:int, value:Any) -> None                    # 设置某角色的数据
data(role:int) -> Any                                   # 获取某角色的数据

  用 setForeground(QColor) 方法和 setBackground(QColor) 方法可以设置前景色和背景色,其中参数 QColor 可以取QBrush、Qt.BrushStyle、Qt.GlobalColor、QGradient、QImage 或 QPixmap。

  用 setCheckState(Qt.CheckState) 方法设置项是否处于勾选状态,其中参数 Qt.CheckState 可以取值如下:

Qt.CheckState.Unchecked           # 未勾选
Qt.CheckState.PartiallyChecked    # 部分勾选,如果有子项
Qt.CheckState.Checked             # 勾选

  用 setFlags(Qt.ItemFlags) 方法设置项的标识,其中参数 Qt.ItemFlags 可取的值如下所示。

Qt.ItemFlag.NoItemFlags                 # 没有标识符
Qt.ItemFlag.ItemIsSelectable            # 项可选
Qt.ItemFlag.ItemIsEditable              # 项可编辑
Qt.ItemFlag.ItemIsDragEnabled           # 项可以拖拽
Qt.ItemFlag.ItemIsDropEnabled           # 项可以拖放
Qt.ItemFlag.ItemIsUserCheckable         # 项可以勾选
Qt.ItemFlag.ItemIsEnabled               # 项被激活
Qt.ItemFlag.ItemIsAutoTristate          # 如有子项,则有第三种状态
Qt.ItemFlag.ItemNeverHasChildren        # 项没有子项
Qt.ItemFlag.ItemIsUserTristate          # 可在三种状态之际爱你循环切换
import sysfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QListWidgetclass MyWidget(QWidget):def __init__(self):# 1.调用父类Qwidget类的__init__()方法super().__init__()# 2.调用setupUi()方法初始化页面self.setup_ui()def setup_ui(self):# 1.设置窗口对象大小self.resize(700, 500)# 2.创建列表控件对象listWidget = QListWidget(self)listWidget.resize(300, 100)# 3.向列表控件中添加值listWidget.addItem("木之本樱")listWidget.addItems(["御坂美琴", "夏娜", "赤瞳", "黑瞳"])# 4.向指定索引处插入值listWidget.insertItem(3, "涂山苏苏")listWidget.insertItems(3, ["白钰袖", "风铃儿"])# 5.获取指定项item = listWidget.item(1)# 6.设置指定项的提示信息item.setToolTip("超电磁炮")# 7.设置当前选择项listWidget.setCurrentItem(item)# 8.设置选择模式listWidget.setSelectionMode(QListWidget.SelectionMode.ExtendedSelection)# 9.设置选择项的方式listWidget.setSelectionBehavior(QListWidget.SelectionBehavior.SelectItems)# 10.设置显示模式listWidget.setViewMode(QListWidget.ViewMode.IconMode)# 11.设置是否自动换行listWidget.setWordWrap(True)# 12.定义信号与槽的连接listWidget.currentItemChanged.connect(self.currentItemChanged)listWidget.currentTextChanged.connect(self.currentTextChanged)listWidget.itemActivated.connect(self.itemActivated)listWidget.itemClicked.connect(self.itemClicked)listWidget.itemDoubleClicked.connect(self.itemDoubleClicked)listWidget.itemEntered.connect(self.itemEntered)listWidget.itemPressed.connect(self.itemPressed)def currentItemChanged(self, current, previous):print(f"当前项被改变了,从【{previous.text()}】变成了【{current.text()}】")def currentTextChanged(self, text):print("当前项的文本被编辑了,编辑后的文本为:", text)def itemActivated(self, item):print(f"【{item.text()}】项被激活了")def itemClicked(self, item):print(f"【{item.text()}】项被单击了")def itemDoubleClicked(self, item):print(f"【{item.text()}】项被双击了")def itemEntered(self, item):print(f"鼠标移入【{item.text()}】项")def itemPressed(self, item):print(f"【{item.text()}】项被按下了")if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())

三、表格控件及其项

  表格控件 QTableWidget 是从 QTableView 类继承而来的,由多行多列构成,并且含有行表头和列表头,表格控件的每个单元格称为一个项(item),每个项是一个 QTableWidgetItem 对象,可以设置每个项的文本、图标、颜色、前景色和背景色等属性。

  用 QTableWidget 类创建表格控件的方法如下所示:

QTableWidget(parent:QWidget=None)
QTableWidget(rows:int, columns:int, parent:QWidget=None)

  其中 parent 是表格控件 QTableWidget 所在的父窗口或控件, rows 和 columns 分别指定表格对象的行和列的数量。

  用 QTableWidgetItem 创建表格项的方法如下所示:

QTableWidgetItem(type=QTableWidgetItem.Type)
QTableWidgetItem(text:str, type=QTableWidgetItem.Type)
QTableWidgetItem(icon:QIcon, text:str, type=QTableWidgetItem.Type)

  其中 type 可取 QTableWidgetItem.Type(值为 0)或 QTableWidgetItem.UserType(值为 1000),前者是默认值,后者是用户自定义类型的最小值。可以用 QTableWidgetItem 类创建子类,定义新表格项。

  QTableWidget 类常用方法如下:

# 实例方法
setRowCount(rows:int) -> None                                                                   # 设置行数
rowCount() -> int                                                                               # 获取行数
setColumnCount(columns:int) -> None                                                             # 设置列数
columnCount() -> int                                                                            # 获取列数setItem(row:int, column:int, item:QTableWidgetItem) -> None                                     # 在指定行和列处设置表格项
takeItem(row:int, column:int) -> QTableWidgetItem                                               # 移除并返回指定表格项setCurrentCell(row:int, column:int) -> None                                                     # 设置当前单元格
setCurrentItem(item:QTableWidgetItem) -> None                                                   # 设置当前的表格项
currentItem() -> QTableWidgetItem                                                               # 返回当前的表格项
currentRow() -> int                                                                             # 返回当前行号
currentColumn() -> int                                                                          # 返回当前列号row(item:QTableWidgetItem) -> int                                                               # 返回指定表格项的行号
column(item:QTableWidgetItem) -> int                                                            # 返回指定表格项的列号setHorizontalHeaderItem(column:int, item:QTableWidgetItem) -> None                              # 设置水平表头
setHorizontalHeaderLabels(labels:Sequence[str]) -> None                                         # 用字符串序列设置水平表头
horizontalHeaderItem(column:int) -> QTableWidgetItem                                            # 获取水平表头的表格项
takeHorizontalHeaderItem(column:int) -> QTableWidgetItem                                        # 移除并返回水平表头的表格项setVerticalHeaderItem(row:int, item:QTableWidgetItem) -> None                                   # 设置垂直表头
setVerticalHeaderLabels(labels:Sequence[str]) -> None                                           # 用字符串序列设置垂直表头
verticalHeaderItem(row:int) -> QTableWidgetItem                                                 # 获取垂直表头的表格项
takeVerticalHeaderItem(row:int) -> QTableWidgetItem                                             # 移除并返回垂直表头的表格项editItem(item:QTableWidgetItem) -> None                                                         # 编辑表格项findItems(text:str, flags:Qt.MatchFlg) -> List[QTableWidgetItem]                                # 获取满足条件的表格项列表
item(row:int, column:int) -> QTableWidgetItem                                                   # 获取指定行和列处的表格项
itemAt(p:QPoint) -> QTableWidgetItem                                                            # 获取指定位置处的表格项
itemAt(x:int, y:int) -> QTableWidgetItem                                                        # 获取指定位置处的表格项openPersistentEditor(item:QTableWidgetItem) -> None                                             # 打开指定项的编辑框,用于编辑文本
isPersistentEditorOpen(item:QTableWidgetItem) -> bool                                           # 返回指定项的编辑框是否打开
closePersistentEditor(item:QTableWidgetItem) -> None                                            # 关闭指定项的编辑框selectedItems() -> List[QTableWidgetItem]                                                       # 返回选择项的列表setCellWidget(row:int, column:int, widget:QWidget) -> None                                      # 设置单元格的控件
cellWidget(row:int, column:int) -> QWidget                                                      # 获取单元格的控件
removeCellWidget(row:int, column:int) -> None                                                   # 移除单元格的控件setSortingEnabled(enable:bool) -> None                                                          # 设置表格控件是否可以排序
isSortingEnabled() -> bool                                                                      # 返回表格控件是否可以排序
sortItems(order:Qt.SortOrder=Qt.AscendingOrder) -> None                                         # 按照排序方式进行项的排序supportedDropActions() -> Qt.DropAction                                                         # 返回支持的拖动和粘贴操作# 槽函数  
insertRow(row:int) -> None                                                                      # 在指定位置插入行
removeRow(row:int) -> None                                                                      # 移除指定行
insertColumn(column:int) -> None                                                                # 在指定位置插入列
removeColumn(column:int) -> None                                                                # 移除指定列
clear() -> None                                                                                 # 清空表格项和表头的内容
clearContents() -> None                                                                         # 清空表格项的内容
scrollToItem(item:QTableWidgetItem, hint=QAbstractItemView.ScrollHint.EnsureVisible) -> None    # 滚动到指定项,使其可见

  QTableWidget 类常用信号如下:

cellActivated(row:int, column:int)                                                          # 单元格活跃时发射信号
cellChanged(row:int, column:int)                                                            # 单元格数据变化时发射信号
cellClicked(row:int, column:int)                                                            # 单击单元格时发射信号
cellDoubleClicked(row:int, column:int)                                                      # 双击单元格时发射信号
cellEntered(row:int, column:int)                                                            # 光标进入单元格时发射信号
cellPressed(row:int, column:int)                                                            # 光标在单元格按下按键时发射信号
currentCellChanged(currentRow:int, currentColumn:int, previousRow:int, previousColumn:int)  # 当前单元格改变时发射信号
currentItemChanged(current:QTableWidgetItem, previous:QTableWidgetItem)                     # 当前表格项改变时发射信号
itemActivated(item:QTableWidgetItem)                                                        # 表格项活跃时发射信号
itemChanged(item:QTableWidgetItem)                                                          # 表格项数据变化时发射信号
itemClicked(item:QTableWidgetItem)                                                          # 单击表格时发射信号                  
itemDoubleClicked(item:QTableWidgetItem)                                                    # 双击表格时发射信号
itemEntered(item:QTableWidgetItem)                                                          # 光标进入表格时发射信号
itemPressed(item:QTableWidgetItem)                                                          # 光标在表格按下按键时发射信号
itemSelectionChanged()                                                                      # 选择的表格项发射改变时发射信号

  QTableWidgetItem 类常用方法如下:

setText(text:str) -> None                               # 设置文字
text() -> str                                           # 获取文字
setTextAlignment(alignment:Qt.Alignment) -> None        # 设置文字对齐方式
setIcon(icon:QIcon) -> None                             # 设置图标
icon() -> QIcon                                         # 获取图标
setToolTip(toolTip:str) -> None                         # 设置提示文字
setFont(font:QFont) -> None                             # 设置字体
setForeground(brush:QColor) -> None                     # 设置前景色
setBackground(brush:QColor) -> None                     # 设置背景色
setStatusTip(statusTip:str) -> None                     # 设置状态提示文字,需激活mouseTracking属性
setWhatsThis(whatsThis:str) -> None                     # 设置按Shift+F1键的显示文字setCheckState(state:Qt.CheckState) -> None              # 设置勾选状态
checkState() -> Qt.CheckState                           # 获取勾选状态
setFlags(flags:Qt.ItemFlag) -> None                     # 设置标识
setSelected(select:bool) -> None                        # 设置是否选中
isSelected() -> bool                                    # 获取是否选中clone() -> QTableWidgetItem                             # 克隆一个项
tableWidget() -> QTableWidget                           # 获取表格视图write(out:QDataStream) -> None                          # 将项写入数据流
read(in:QDataStream) -> None                            # 从数据流中读取项
setData(role:int, value:Any) -> None                    # 设置某角色的数据
data(role:int) -> Any                                   # 获取某角色的数据
import sysfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QTableWidget, QTableWidgetItemclass MyWidget(QWidget):def __init__(self):# 1.调用父类Qwidget类的__init__()方法super().__init__()# 2.调用setupUi()方法初始化页面self.setup_ui()def setup_ui(self):# 1.设置窗口对象大小self.resize(700, 500)# 2.创建表格控件对象self.tableWidget = QTableWidget(self)self.tableWidget.resize(700, 500)# 3.设置表格的行数self.tableWidget.setRowCount(3)# 4.设置表格的列数self.tableWidget.setColumnCount(4)# 5.设置表格的水平表头self.tableWidget.setHorizontalHeaderLabels(["部门", "姓名", "性别", "年龄"])# 6.设置表格的垂直表头self.tableWidget.setVerticalHeaderLabels(["1", "2", "3"])department_list = ["魔法部", "超能力部"]person_list = [{"department": department_list[0], "name": "木之本樱", "gender": "女", "age": 10},{"department": department_list[0], "name": "夏娜", "gender": "女", "age": 15},{"department": department_list[1], "name": "御坂美琴", "gender": "女", "age": 14},]for i in range(0, len(person_list)):j = 0for key, value in person_list[i].items():item = QTableWidgetItem(str(value))# 7.设置单元格的内容self.tableWidget.setItem(i, j, item)j += 1# 8.设置表格列的宽度跟随内容改变self.tableWidget.resizeColumnsToContents()# 9.设置表格行的高度跟随内容改变self.tableWidget.resizeRowsToContents()# 10.设置单元格是否可以编辑self.tableWidget.setEditTriggers(QTableWidget.EditTrigger.DoubleClicked)# 11.设置表格颜色交错显示self.tableWidget.setAlternatingRowColors(True)# 12.设置表格的选择行为self.tableWidget.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectItems)# 13.设置是否自动换行self.tableWidget.setWordWrap(True)# 14.设置是否显示网格self.tableWidget.setShowGrid(True)# 15.合并单元格self.tableWidget.setSpan(0, 0, 2, 1)# 16.定义信号与槽的连接self.tableWidget.itemClicked.connect(self.itemClicked)self.tableWidget.itemDoubleClicked.connect(self.itemDoubleClicked)self.tableWidget.itemChanged.connect(self.itemChanged)self.tableWidget.itemSelectionChanged.connect(self.itemSelectionChanged)self.tableWidget.cellClicked.connect(self.cellClicked)self.tableWidget.cellDoubleClicked.connect(self.cellDoubleClicked)self.tableWidget.cellChanged.connect(self.cellChanged)self.tableWidget.currentCellChanged.connect(self.currentCellChanged)def itemClicked(self, item):print(f"【{item.text()}】表格项被单击了")def itemDoubleClicked(self, item):print(f"【{item.text()}】表格项被双击了")def itemChanged(self, item):print(f"【{item.text()}】表格项内容被更改了")def itemSelectionChanged(self):print("你选中的表格项更改了")def cellClicked(self, row, column):item = self.tableWidget.item(row, column)print(f"【{item.text()}】单元格被单击了")def cellDoubleClicked(self, row, column):item = self.tableWidget.item(row, column)print(f"【{item.text()}】单元格被双击了")def cellChanged(self, row, column):item = self.tableWidget.item(row, column)print(f"【{item.text()}】单元格内容被更改了")def currentCellChanged(self, current_row, current_column, previous_row, previsou_column):previous_item = self.tableWidget.item(previous_row, previsou_column)current_item = self.tableWidget.item(current_row, current_column)if previous_item:previous_item_text = previous_item.text()else:previous_item_text = Nonecurrent_item_text = current_item.text()print(f"你选中的单元格从【{previous_item_text}】变成了【{current_item_text}】")if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())

四、树控件及其项

  树结构控件 QTreeWidget 继承自 QTreeView 类,它是 QTreeView 的便利类。树结构控件由 1 列或多列构成,没有行的概念。树结构控件有 1 个或多个顶层项,顶层项下面有任意多个子项,子项下面还可以有子项,顶层项没有父项。顶层项和子项都是 QTreeWidgetItem,每个 QTreeWidgetItem 可以定义在每列显示的文字和图标,一般应在第 1 列中定义文字或图标,其他列中是否设置文字和图标,需要用户视情况而定。可以把每个项理解成树结构控件的一行,只不过行之间有层级关系,可以折叠和展开。

  用 QTreeWidget 类创建树结构控件的方法如下。

QTreeWidget(parent:QWidget=None)

  其中 parent 是 QTreeWidget 树结构控件所在的父窗口或控件。

  用 QTreeWidgetItem 类创建树结构项的方法如下。

QTreeWidgetItem(type=QTreeWidgetItem.Type)
QTreeWidgetItem(strings:Sequence[str], type=QTreeWidgetItem.Type)
QTreeWidgetItem(treeview:QTreeWidget, type=QTreeWidgetItem.Type)
QTreeWidgetItem(treeview:QTreeWidget, strings:Sequence[str], type=QTreeWidgetItem.Type)
QTreeWidgetItem(parent:QTreeWidgetItem, type=QTreeWidgetItem.Type)
QTreeWidgetItem(parent:QTreeWidgetItem, strings:Sequence[str], type=QTreeWidgetItem.Type)
QTreeWidgetItem(parent:QTreeWidgetItem, after:QTreeWidgetItem, type=QTreeWidgetItem.Type)

  其中 Sequence[str] 表示字符串序列,是各列上的文字。第 1 个参数是 QTreeWidget 时表示项追加到树结构控件中,这时新创建的项是顶层项;第 1 个参数是 QTreeWidgetItem 表示父项,这时新创建的项作为子项追加到父项下面;第 2 个参数是 QTreeWidgetItem 时表示新创建的项插入到该项的后面。type 可以取 QTreeWidgetItem.Type(值是 0)或 QTreeWidgetItem.UserType(值是 1000,自定义类型的最小值)。

  QTreeWidget 类常用方法如下:

# 实例方法
setColumnCount(columns:int) -> None                                                             # 设置列数
columnCount() -> int                                                                            # 获取列数
currentColumn() -> int                                                                          # 返回当前列
setColumnWidth(column:int, width:int) -> None                                                   # 设置列宽  
setColumnHidden(column:int, hide:bool) -> None                                                  # 设置列是否隐藏addTopLevelItem(item:QTreeWidgetItem) -> None                                                   # 添加顶层项
addTopLevelItems(items:Sequence[QTreeWidgetItem]) -> None                                       # 添加多个顶层项  
insertTopLevelItem(index:int, item:QTreeWidgetItem) -> None                                     # 插入顶层项
insertTopLevelItems(index:int, items:Sequence[QTreeWidgetItem]) -> None                         # 插入多个顶层项
takeTopLevelItem(index:int) -> QTreeWidgetItem                                                  # 移除并获取顶层项
topLevelItem(index:int) -> QTreeWidgetItem                                                      # 返回索引是index的顶层项
topLevelItemCount() -> int                                                                      # 返回顶层项的数量
indexOfTopLevelItem(item:QTreeWidgetItem) -> int                                                # 返回顶层项的索引setCurrentItem(item:QTreeWidgetItem) -> None                                                    # 把指定的项设置为当前项
setCurrentItem(item:QTreeWidgetItem, column:int) -> None                                        # 设置当前项和当前列
currentItem() -> QTreeWidgetItem                                                                # 获取当前项editItem(item:QTreeWidgetItem, column:int=0) -> None                                            # 编辑表格项
openPersistentEditor(item:QTreeWidgetItem, column:int) -> None                                  # 打开指定项的编辑框,用于编辑文本
isPersistentEditorOpen(item:QTreeWidgetItem, column:int) -> bool                                # 返回指定项的编辑框是否打开
closePersistentEditor(item:QTreeWidgetItem, column:int) -> None                                 # 关闭指定项的编辑框findItems(text:str, flags:Qt.MatchFlg, column:int=0) -> List[QTreeWidgetItem]                   # 获取满足条件项的列表setHeaderItem(item:QTreeWidgetItem) -> None                                                     # 设置表头
setHeaderLabel(label:str) -> None                                                               # 设置表头的第一列文字itemAt(p:QPoint) -> QTableWidgetItem                                                            # 获取指定位置处的表格项
itemAt(x:int, y:int) -> QTableWidgetItem                                                        # 获取指定位置处的表格项invisibleRootItem() -> QTreeWidgetItem                                                          # 获取根项
itemAbove(item:QTreeWidgetItem) -> QTreeWidgetItem                                              # 返回指定项之前的项
itemBelow(item:QTreeWidgetItem) -> QTreeWidgetItem                                              # 返回指定项之后的项selectedItems() -> List[QTreeWidgetItem]                                                        # 返回选择项的列表setItemWidget(item:QTreeWidgetItem, column:int, widget:QWidget) -> None                         # 在指定项的指定列设置控件
itemWidget(item:QTreeWidgetItem, column:int) -> QWidget                                         # 获取项上的控件
removeItemWidget(item:QTreeWidgetItem, column:int) -> None                                      # 移除项上的控件# 槽函数  
scrollToItem(item:QTreeWidgetItem, hint=QAbstractItemView.ScrollHint.EnsureVisible) -> None     # 滚动到指定项,使其可见
collapseItem(item:QTreeWidgetItem) -> None                                                      # 折叠项
collapseAll() -> None                                                                           # 折叠所有项
expandItem(item:QTreeWidgetItem) -> None                                                        # 展开项
expandAll() -> None                                                                             # 展开所有项
clear() -> None                                                                                 # 清空所有项

  QTreeWidget 类常用信号如下:

currentItemChanged(current:QTreeWidgetItem, previous:QTreeWidgetItem)   # 当前项改变时发射信号
itemActivated(item:QTreeWidgetItem, column:int)                         # 项活跃时发射信号
itemChanged(item:QTreeWidgetItem, column:int)                           # 项数据变化时发射信号
itemClicked(item:QTreeWidgetItem, column:int)                           # 单击项时发射信号  
itemDoubleClicked(item:QTreeWidgetItem, column:int)                     # 双击项时发射信号
itemEntered(item:QTreeWidgetItem, column:int)                           # 光标进入项时发射信号
itemPressed(item:QTreeWidgetItem, column:int)                           # 在项上按下按键时发射信号
itemExpanded(item:QTreeWidgetItem)                                      # 展开项时发射信号
itemCollapsed(item:QTreeWidgetItem)                                     # 折叠项时发射信号
itemSelectionChanged()                                                  # 选择的项发射改变时发射信号

   QTreeWidgetItem 类常用方法如下:

addChild(child:QTreeWidgetItem) -> None                                         # 添加子项
addChildren(children:Sequence[QTreeWidgetItem]) -> None                         # 添加多个子项
insertChild(index:int, child:QTreeWidgetItem) -> None                           # 插入子项
insertChildren(index:int, children:Sequence[QTreeWidgetItem]) -> None           # 插入多个子项
child(index:int) -> QTreeWidgetItem                                             # 获取子项
childCount() -> int                                                             # 获取子项数量
takeChild(index:int) -> QTreeWidgetItem                                         # 移除并返回子项
takeChildren() -> List[QTreeWidgetItem]                                         # 移除并返回所有子项
removeChild(child:QTreeWidgetItem) -> None                                      # 移除子项parent() -> QTreeWidgetItem                                                     # 获取父项
treeWidget() -> QTreeWidget                                                     # 获取树视图setText(column:int, text:str) -> None                                           # 设置文字
text(column:int) -> str                                                         # 获取文字
setTextAlignment(column:int, alignment:Qt.Alignment) -> None                    # 设置文字对齐方式
setIcon(column:int, icon:QIcon) -> None                                         # 设置图标
icon(column:int) -> QIcon                                                       # 获取图标
setToolTip(column:int, toolTip:str) -> None                                     # 设置提示文字
setFont(column:int, font:QFont) -> None                                         # 设置字体
font(column:int) -> QFont                                                       # 获取字体
setForeground(column:int, brush:QColor) -> None                                 # 设置前景色
setBackground(column:int, brush:QColor) -> None                                 # 设置背景色
setStatusTip(column:int, statusTip:str) -> None                                 # 设置状态提示文字,需激活mouseTracking属性
setWhatsThis(column:int, whatsThis:str) -> None                                 # 设置按Shift+F1键的显示文字setCheckState(column:int, state:Qt.CheckState) -> None                          # 设置勾选状态
checkState(column:int) -> Qt.CheckState                                         # 获取勾选状态
setFlags(flags:Qt.ItemFlag) -> None                                             # 设置标识
setSelected(select:bool) -> None                                                # 设置是否选中
isSelected() -> bool                                                            # 获取是否选中
setHidden(hide:bool) -> None                                                    # 设置是否隐藏
setDisabled(disabled:bool) -> None                                              # 设置是否禁用
isDisabled() -> bool                                                            # 获取是否禁用
setExpanded(expand:bool) -> None                                                # 设置是否展开
isExpanded() -> bool                                                            # 获取是否展开
setFirstColumnSpanned(span:bool) -> None                                        # 设置是否只显示第一列的内容
setChildIndicatorPolicy(policy:QTreeWidgetItem.ChildIndicatorPolicy) -> None    # 设置展开/折叠标识的显示策略
childIndicatorPolicy() -> QTreeWidgetItem.ChildIndicatorPolicy                  # 获取展开策略columnCount() -> int                                                            # 获取列数
indexOfChild(child:QTreeWidgetItem) -> int                                      # 获取子项的索引
sortChildren(column:int, order:Qt.SortOrder) -> None                            # 对子项进行排序setData(column:int, role:int, value:Any) -> None                                # 设置某角色的数据
data(column:int, role:int) -> Any                                               # 获取某角色的数据
import sysfrom PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QTreeWidget, QTreeWidgetItem
from PySide6.QtGui import QPixmap, Qtclass MyWidget(QWidget):def __init__(self):# 1.调用父类Qwidget类的__init__()方法super().__init__()# 2.调用setupUi()方法初始化页面self.setup_ui()def setup_ui(self):# 1.设置窗口对象大小self.resize(700, 500)# 2.创建树控件treeWidget = QTreeWidget(self)treeWidget.resize(700, 500)# 3.设置列标题名treeWidget.setHeaderLabels(["部门", "姓名", "性别", "年龄"])# 4.设置树结构中的列数treeWidget.setColumnCount(4)# 5.设置列的宽度treeWidget.setColumnWidth(0, 100)department_list = ["魔法部", "超能力部"]person_list = [{"name": "木之本樱", "gender": "女", "age": 10, "department": department_list[0]},{"name": "御坂美琴", "gender": "女", "age": 14, "department": department_list[1]},{"name": "夏娜", "gender": "女", "age": 15, "department": department_list[0]},]for department in department_list:# 一级节点department_item = QTreeWidgetItem(treeWidget)department_item.setText(0, department)# 6.添加顶级节点treeWidget.addTopLevelItem(department_item)for person in person_list:# 二级节点if person["department"] == department:person_item = QTreeWidgetItem(department_item)# 7.设置节点的文本person_item.setText(0, "")# 8.设置节点的图标person_item.setIcon(0, QPixmap("1.ico"))# 9.设置节点的选中状态person_item.setCheckState(0, Qt.CheckState.Unchecked)i = 1for key, value in person.items():if not key == "department":person_item.setText(i, str(value))if value == "木之本樱":person_item.setCheckState(0, Qt.CheckState.Checked)i += 1# 10.设置单击头部时是否可以排序treeWidget.setSortingEnabled(True)# 11.设置是否显示垂直滚动条treeWidget.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)# 12.设置是否显示水平滚动条treeWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)# 13.设置每间隔一行颜色是否一致treeWidget.setAlternatingRowColors(True)# 14.设置是否自动换行treeWidget.setWordWrap(False)# 15.设置是否支持双击展开树节点treeWidget.setExpandsOnDoubleClick(True)# 16.设置选中模式treeWidget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)# 17.设置选中方式treeWidget.setSelectionBehavior(QTreeWidget.SelectionBehavior.SelectItems)# 18.设置自动展开的时间,单位为毫秒,如果值小于0,表示禁用自动展开treeWidget.setAutoExpandDelay(-1)# 19.展开所有节点treeWidget.expandAll()# 20.定义信号与槽的连接treeWidget.itemClicked.connect(self.itemClicked)treeWidget.currentItemChanged.connect(self.currentItemChanged)treeWidget.itemExpanded.connect(self.itemExpanded)treeWidget.itemCollapsed.connect(self.itemCollapsed)def itemClicked(self, item, column):print(f"你单击了【{item.text(column)}】")def currentItemChanged(self, current, previous):current_text = current.text(0)previous_text = previous.text(0) if previous else Noneprint(f"你选中的项从【{previous_text}】变成了【{current_text}】")def itemExpanded(self, item):print(f"你展开了【{item.text(0)}】项")def itemCollapsed(self, item):print(f"你收缩了【{item.text(0)}】项")if __name__ == "__main__":# 1.创建一个QApplication类的实例app = QApplication(sys.argv)# 2.创建一个窗口window = MyWidget()# 3.展示窗口window.show()# 4.进入程序的主循环并通过exit()函数确保主循环安全结束sys.exit(app.exec())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868291.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杂题选记

杂题选记在网上天天划水刷面经,见到 teaser 就记下来。我的想法是,把 8L 倒入 3L,把 3L 倒入 5L,把 8L 倒入 3L,把 3L 倒入 5L,这时候三个瓶子分别有 1L(8L) 2L(3L) 5L(5L) 括号里面表示瓶子最开始的容量。这时候把 1L 水倒掉,把容积为 8L 的瓶子里面的 2L 水倒到 容积为…

pytorch算子调用过程:以rand算子为例

通过pytorch的torch.profiler带调用栈采集运行过程可以看到如下信息,通过chrome://tracing查看,图上每个小条条表示一个traceEvent, json中的信息如下图所示,其中cat表示traceEvent的类型,有cpu_op,python_function等,前者表示torch的cpp代码中定义的操作,后者表示pytorc…

Wordpress更换域名后,网站显示框架和加载问题解决

最近建立了一个站点,由于先使用ip进行网站搭建,经过一段时间备案完成后,需要转成域名。直接在Wordpress后台操作后,直接导致网页框架显示异常,排版错乱,大概就是主题的框架无法加载导致的。 搞了很久,包括恢复数据库和重新建站都是这样,最终发现是伪静态的问题。 我是使…

【Weblogic T3协议】反序列化漏洞分析(上)

免责声明 此文章中所涉及的技术、思路和工具仅供网络安全学习为目的,不得以盈利为目的或非法利用,否则后果自行承担!一、前言 在初入安全的时候,就听说过weblogic的大名,当然听说的并不是weblogic如何如何好用,而是因为其漏洞出现频率实在是有点高...于是乎,便抱着学习的…

关于安卓edge无法播放Wordpress上传的mp4视频问题

使用默认插件上传后,电脑端可以播放视频,其他手机浏览器均可播放视频,但是安卓edge无法加载视频。 大概是如下图样子:经查发现电脑打开页面会显示站点部分不安全的提示,说明edge端做了一些阻挡处理,导致视频无法播放。找了一些资料后,发现可以自行修改加载视频的代码框架…

【bt下载软件qBittorrent-增强版】下载链接

原作者github项目地址:https://github.com/c0re100/qBittorrent-Enhanced-Edition 找到当前的最新版本根据自身需要选择下载版本,这里选的是windows版本

鸟哥的Linux私房菜 基础学习篇 第四版PDF、EPUB免费下载

Linux入门书升级版,适用Linux系统应用和开发及运维的人员,涵盖linux内核,命令行,嵌入式,基于CentOS,7.x适读人群 :Linux初学者 适合Linux管理员作为参考手册 Linux入门书升级版,适用Linux系统应用和开发及运维的人员,涵盖linux内核,命令行,嵌入式,基于CentOS,7.x电…

领域驱动设计:软件核心复杂性应对之道(修订版)PDF、EPUB免费下载

本书是领域驱动设计方面的经典之作,修订版更是对之前出版的中文版进行了全面的修订和完善。全书围绕着设计和开发实践,结合若干真实的项目案例,向读者阐述如何在真实的软件开发中应用领域驱动设计。书中给出了领域驱动设计的系统化方法,并将人们普遍接受的一些实践综合到一…

JAVA之集合

1、集合集合可以存储引用数据类型; 集合不可以存储基本数据类型,若要存储,需封装成包装类;2、集合和数组的对比长度【数组长度固定,集合长度可变】 存储类型【数组可以存基本数据类型和引用数据类型,集合可以存引用数据类型,若存储基本数据类型,需封装成包装类】3、Arr…

[题目记录]P9999 [Ynoi2000] tmostnrq

当前自己写过了码量第二大的题目 , 不管怎么说对拍非常重要 .P9999 [Ynoi2000] tmostnrq 题意 给定 \(n\) 个顶点的树,顶点编号为 \(1,\dots,n\),给定长度 \(n_0\) 的序列 \(a_1,\dots,a_{n_0}\),共 \(m\) 次查询,每次查询给定 \(l,r,x\),问树的顶点 \(x\),依次向 \(a_l,…

多光谱火焰智能监测摄像机

多光谱火焰智能监测摄像机将在未来继续发展。未来的摄像机可能会更加智能化,具备更强的自主识别和决策能力,进一步提升火灾监测的灵敏度和准确性。此外,随着物联网的发展,这些摄像机还有望与其他设备和系统实现更深入的数据共享和集成应用,为整个安全监控体系增添新的可能…

明火智能监测摄像机

明火智能监测摄像机检测到火源时,它会立即触发报警机制,以警告人员采取适当的行动。它可以与各种报警系统集成,发出清晰可闻的警报声,并通过网络将警报信息发送到相关部门或人员的手机应用程序,确保快速响应。明火智能监测摄像机全天候工作,不间断地监测环境中的火情。它…