pyqt5-QTableWidget

self.window.tableWidget_2: QTableWidget
        self.window.tableWidget_2.setColumnCount(7)
        self.window.tableWidget_2.setHorizontalHeaderLabels(['名称', '所在目录', '类型', '大小',
                                                             '创建时间', '访问时间', '更新时间'])
        self.window.tableWidget_2.horizontalHeader().setStretchLastSection(True)
        self.window.tableWidget_2.verticalHeader().setVisible(False)
        self.window.tableWidget_2.setContextMenuPolicy(Qt.CustomContextMenu)
        self.window.tableWidget_2.customContextMenuRequested.connect(self.tableWidget_2_rightmenu)
        self.window.tableWidget_2.currentItemChanged.connect(self.tableWidget_2_currentItemChanged)

1、介绍

这是pyqt的表格组件。

2、类和初始化

class QTableWidget(QTableView):
    def __init__(self, *__args):
        pass

示例:

self.table = QTableWidget(self.w)

快速查找:

QTableWidget(parent: typing.Optional[QWidget] = None)
QTableWidget(rows: int, columns: int, parent: typing.Optional[QWidget] = None)
cellWidget(self, row: int, column: int) -> QWidget
clear(self)
clearContents(self)
closePersistentEditor(self, item: QTableWidgetItem)
column(self, item: QTableWidgetItem) -> int
columnCount(self) -> int
currentColumn(self) -> int
currentItem(self) -> QTableWidgetItem
currentRow(self) -> int
dropMimeData(self, row: int, column: int, data: QMimeData, action: Qt.DropAction) -> bool
editItem(self, item: QTableWidgetItem)
findItems(self, text: str, flags: Union[Qt.MatchFlags, Qt.MatchFlag]) -> List[QTableWidgetItem]
horizontalHeaderItem(self, column: int) -> QTableWidgetItem
indexFromItem(self, item: QTableWidgetItem) -> QModelIndex
insertColumn(self, column: int)
insertRow(self, row: int)
isPersistentEditorOpen(self, item: QTableWidgetItem) -> bool
isSortingEnabled(self) -> bool
item(self, row: int, column: int) -> QTableWidgetItem
itemAt(self, p: QPoint) -> QTableWidgetItem
itemAt(self, ax: int, ay: int) -> QTableWidgetItem
itemFromIndex(self, index: QModelIndex) -> QTableWidgetItem
itemPrototype(self) -> QTableWidgetItem
items(self, data: QMimeData) -> List[QTableWidgetItem]
mimeData(self, items: Iterable[QTableWidgetItem]) -> QMimeData
mimeTypes(self) -> List[str]
openPersistentEditor(self, item: QTableWidgetItem)
removeCellWidget(self, arow: int, acolumn: int)
removeColumn(self, column: int)
removeRow(self, row: int)
row(self, item: QTableWidgetItem) -> int
rowCount(self) -> int
scrollToItem(self, item: QTableWidgetItem, hint: QAbstractItemView.ScrollHint = QAbstractItemView.EnsureVisible)
selectedItems(self) -> List[QTableWidgetItem]
selectedRanges(self) -> List[QTableWidgetSelectionRange]
setCellWidget(self, row: int, column: int, widget: QWidget)
setColumnCount(self, columns: int)
setCurrentCell(self, row: int, column: int)
setCurrentCell(self, row: int, column: int, command: Union[QItemSelectionModel.SelectionFlags, QItemSelectionModel.SelectionFlag])
setCurrentItem(self, item: QTableWidgetItem)
setCurrentItem(self, item: QTableWidgetItem, command: Union[QItemSelectionModel.SelectionFlags, QItemSelectionModel.SelectionFlag])
setHorizontalHeaderItem(self, column: int, item: QTableWidgetItem)
setHorizontalHeaderLabels(self, labels: Iterable[str])
setItem(self, row: int, column: int, item: QTableWidgetItem)
setItemPrototype(self, item: QTableWidgetItem)
setRangeSelected(self, range: QTableWidgetSelectionRange, select: bool)
setRowCount(self, rows: int)
setSortingEnabled(self, enable: bool)
setVerticalHeaderItem(self, row: int, item: QTableWidgetItem)
setVerticalHeaderLabels(self, labels: Iterable[str])
sortItems(self, column: int, order: Qt.SortOrder = Qt.AscendingOrder)
supportedDropActions(self) -> Qt.DropActions
takeHorizontalHeaderItem(self, column: int) -> QTableWidgetItem
takeItem(self, row: int, column: int) -> QTableWidgetItem
takeVerticalHeaderItem(self, row: int) -> QTableWidgetItem
verticalHeaderItem(self, row: int) -> QTableWidgetItem
visualColumn(self, logicalColumn: int) -> int
visualItemRect(self, item: QTableWidgetItem) -> QRect
visualRow(self, logicalRow: int) -> int
---------------
dropEvent(self, event: QDropEvent)
event(self, e: QEvent) -> bool
---------------
cellActivated(self, row: int, column: int) [signal]
cellChanged(self, row: int, column: int) [signal]
cellClicked(self, row: int, column: int) [signal]
cellDoubleClicked(self, row: int, column: int) [signal]
cellEntered(self, row: int, column: int) [signal]
cellPressed(self, row: int, column: int) [signal]
currentCellChanged(self, currentRow: int, currentColumn: int, previousRow: int, previousColumn: int) [signal]
currentItemChanged(self, current: QTableWidgetItem, previous: QTableWidgetItem) [signal]
itemActivated(self, item: QTableWidgetItem) [signal]
itemChanged(self, item: QTableWidgetItem) [signal]
itemClicked(self, item: QTableWidgetItem) [signal]
itemDoubleClicked(self, item: QTableWidgetItem) [signal]
itemEntered(self, item: QTableWidgetItem) [signal]
itemPressed(self, item: QTableWidgetItem) [signal]
itemSelectionChanged(self) [signal]

常用设置:

        self.window.tableWidget_2: QTableWidget
        self.window.tableWidget_2.setColumnCount(7)
        self.window.tableWidget_2.setHorizontalHeaderLabels(['名称', '所在目录', '类型', '大小',
                                                             '创建时间', '访问时间', '更新时间'])
        self.window.tableWidget_2.horizontalHeader().setStretchLastSection(True)
        self.window.tableWidget_2.verticalHeader().setVisible(False)
        self.window.tableWidget_2.setContextMenuPolicy(Qt.CustomContextMenu)
        self.window.tableWidget_2.customContextMenuRequested.connect(self.tableWidget_2_rightmenu)
        self.window.tableWidget_2.currentItemChanged.connect(self.tableWidget_2_currentItemChanged)

3、属性

4、方法

(1)columnCount和rowCount

  • 返回int类型,即列数和行数,最低为0,即空白,此时没有表头

(2)setColumnCount和setRowCount

  • 设置int参数,即列数和行数。如果行置为0,即清除表格
  • 此时获取列数和行数,即为设置的值
  • 标题行和序号列不计入获取的行数和列数

(3)insertRow和insertColumn

insertRow(self, row: int)
insertColumn(self, column: int)
  • 设置int参数,表示在指定位置插入行或者列
  • 最低为0,表示首行或者首列,设置时在最前进行插入。最大为rowCount()或columnCount(),设置时在最后进行插入。
  • 参数超出范围,则不进行插入行或列,也不报错
arr = ['', '']
self.window.tableWidget.insertRow(self.window.tableWidget.rowCount())
for i in range(len(arr)):
    self.window.tableWidget.setItem(self.window.tableWidget.rowCount()-1, i, QTableWidgetItem(arr[i]))

(4)removeRow和removeColumn

  • 设置int参数,表示移除指定的行或列
  • 最低为0,表示首行或者首列,设置时移除首行或首列。最大为rowCount()-1或columnCount()-1,设置时移除末行或末列。
  • 参数超出范围,比如-1和1000,则不移除行或列,也不报错

(5)setItem

  • 用于设置单元格的值,需要设置行索引和列索引,都是从0开始。也就是说需要在前面直接设置或者插入行和列,使得指定的单元格是先于存在的
  • 可以直接设置或间接设置
  • 如果没有设置,则生成GUI中该单元格虽然显示,但是实际为None,无法被选择操作。如果事件触发,比如currentItemChanged,current对象返回None,无法获取其他信息
item = QTableWidgetItem()
item.setText('单元格')
self.table.setItem(0,0,item)
self.table.setItem(0,1, QTableWidgetItem('单元格'))

(6)item

  • 指定行索引和列索引,都是从0开始,返回指定的单元格对象,即QTableWidgetItem。
  • 对单元格可以进行操作
    • setText:即设置单元格文本。如果已经通过QTableWidgetItem为单元格赋过值,可以采用该方法进行快速设置。否则会报错
    • setFlags:Qt.ItemIsEnabled。设置该单元格只读模式
    • setTextAlignment 设置对其方式
    • text 获取单元格内容
item(0,0)
item(0,0).setText('更新')
item(0,0).setFlags(Qt.ItemIsEnabled) # 参数名字段不允许修改

from PySide2.QtCore import Qt
item(0,0).setTextAlignment(Qt.AlignHCenter)  #居中对其
item(0,0).text() # 获取单元格内容

 

 

(13)row和column

row(self, item: QTableWidgetItem) -> int
column(self, item: QTableWidgetItem) -> int
  • 获取指定item的行索引和列索引
  • 如果指定参数为None,返回-1和-1
  • 这里的QTableWidgetItem并不是自定义创建的,而是基于事件等情况从表格对象直接获取的。前者查询不到任何东西,返回-1

(14)clear

clear(self)
  • 该方法实际是清除各单元格的QTableWidgetItem对象,保留行和列。相当于创建表格,然后执行对应行数的insertRow方法。此时item通过行列索引获取单元格均为None
  • 会删除表头名称,但是如果设置表头是显示,那么表头会显示1,2,3..的数字序列
  • 执行后,current当前选中项和其行列索引,会指向None,-1,-1

(15)clearContents

  • 清除表格内容,作用和clear基本一致,唯一的区别是保留表头名称

(16)当前

currentItem(self) -> QTableWidgetItem
currentRow(self) -> int
currentColumn(self) -> int
  • 分别获取当前的项,行索引和列索引
  • 以下几种情况下,这三个方法分别会返回None,-1和-1
    • 表格创建,列标题创建,此时获取
    • 表格创建,列标题创建,此时点击某列,然后获取当前
    • 表格创建,insert添加了行数据(是否QTableWidgetItem创建对象不影响),但是未设置当前项或者未手动点击某项
  • 点击表格外的区域不影响选中项,即不影响这三个方法的返回值
  • 点击列标题,则选中项的行索引为0,列索引即为该列。点击行标题类似
  • 如果被点击单元格未通过QTableWidgetItem创建对象,仍然可以选中,返回None以及对应的行和列索引
  • 如果通过ctrl+同时选择多个项,这三个方法返回的项是最后一次点击的项
  • 如果removeRow方法移除当前行,则再获取当前行是前面被移除当前行-1。如果当前行是0,被移除后仍然不为空,则当前行变为0。如果当前行是5,则被移除后,当前行变为4

(17)隐藏表头

self.table.verticalHeader().setVisible(False)#隐藏垂直表头
self.table.verticalHeader().setVisible(False)#隐藏水平表头
self.table.setHorizontalHeaderLabels(['第一行列','第二列','第三列','第四列'])
self.table.setVerticalHeaderLabels(['第一行','第二行','第三行','第四行','第五行'])

(18)设置单元格的字体色、背景色等

setForeground(self, brush: Union[QBrush, QColor, Qt.GlobalColor, QGradient])
setBackground(self, brush: Union[QBrush, QColor, Qt.GlobalColor, QGradient])
setFont(self, afont: QFont)
setIcon(self, aicon: QIcon)
  • 这几个方法都是QTableWidgetItem的方法,针对的是单个的单元格。可以设置字体颜色、背景色、字体和图片
  • 设置字体颜色和背景色各有四种形式 
# 设置背景色
self.ui.tableWidget.item(0, 2).setBackground(QBrush(QColor(0, 0, 255)))
# 设置前景色,即字体颜色
self.ui.tableWidget.item(0, 1).setForeground(QBrush(QColor(0, 0, 255)))

(19)设置列的宽度

1)默认的

如果未做任何关于列的设置,表格列数和各列的内容进行占据使用宽度,可能会空白

2)设置拉伸最后一节

self.window.tableWidget.horizontalHeader().setStretchLastSection(True)

最后一个列会占用剩余的宽度

 

 3)各列水平均分

from PyQt5 import QtWidgets

self.window.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
  • 注意这里QtWidgets所引入的模块名
  • QtWidgets.QHeaderView.Stretch实际是一个类变量,值为1

4)直接设置列宽度

setColumnWidth(self, column: int, width: int)
  • 该方法是QTableWidget的父类QTableView类的方法,可以指定列索引设置固定宽度,单位为像素
  • 该方法可以和设置拉伸最后一节同时使用,但是对最后一列,是拉伸的设置优先级更高

(20)排序

sortItems(self, column: int, order: Qt.SortOrder = Qt.AscendingOrder)
  • 指定某列进行排序,column对应列索引。order表示升序或者降序排列,可以设置为False或True,默认为升序排列False
  • 表格默认是根据行的添加顺序排列的,并非根据索引为0
  • 调用该方法是对当前表格中的行按照某类列排序,之后对某行编辑,或者在insert插入新行是不受排序影响的
setSortingEnabled(self, enable: bool)
  • 设置表格能否点击列实现排序,默认是False
  • 值得注意的是,与sortItems的一次性排序不同,设置setSortingEnabled方法为True之后,点击某列标题进行排序。再添加数据时,也会根据此列进行排序
isSortingEnabled(self) -> bool
  • 获取表格能否点击列实现排序,默认是False

5、事件

self.table.cellChanged.connect()
  • 当用户修改了一个单元格的内容,会发出 cellChanged 信号,并且携带参数指明该单元格的行号和列号。
  • 关于上述当前项变化的规律,需要注意clear、insert造成的当前项变化触发事件
cellClicked(self, p_int, p_int_1)
cellDoubleClicked(self, p_int, p_int_1)
itemClicked(self, QTableWidgetItem)
itemDoubleClicked(self, QTableWidgetItem)

cellChanged(self, p_int, p_int_1):
columnCountChanged
currentCellChanged(self, p_int, p_int_1, p_int_2, p_int_3)
currentChanged(self, *args, **kwargs)
currentItemChanged(self, QTableWidgetItem, QTableWidgetItem_1)
dataChanged(self, *args, **kwargs)
horizontalScrollbarValueChanged(self, *args, **kwargs)
itemChanged(self, QTableWidgetItem)
itemSelectionChanged(self)
rowCountChanged(self, *args, **kwargs)
selectionChanged(self, *args, **kwargs)
verticalScrollbarValueChanged(self, *args, **kwargs)

 

posted @ 2023-04-16 23:42  挖洞404  阅读(493)  评论(0编辑  收藏  举报