PyQt5 – QTableWidget

  • Post category:Python

下面是PyQt5中QTableWidget的完整使用攻略,包含基本使用方法和示例说明。

一、QTableWidget简介

QTableWidget是PyQt5中常用的表格控件,可以方便地展示二维表格数据。QTableWidget可以自定义列数、行数,还可以设置不同的对齐方式、列宽、表头等。同时,可以支持多种操作,如快捷键复制、粘贴、选项框选、双击编辑等。

二、基本使用方法

2.1 创建表格

首先,我们需要创建QTableWidget表格控件,可以通过以下代码实现:

from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem

table_widget = QTableWidget()
table_widget.setRowCount(5) # 设置表格行数
table_widget.setColumnCount(3) # 设置表格列数

header_labels = ['姓名', '性别', '年龄']
table_widget.setHorizontalHeaderLabels(header_labels) # 设置表头

# 填充表格数据
for row in range(5):
    for col in range(3):
        cell_data = '({row}, {col})'.format(row=row+1, col=col+1)
        table_item = QTableWidgetItem(cell_data)
        table_widget.setItem(row, col, table_item)

上述代码演示了如何创建5行3列的表格,并设置表头为“姓名”、“性别”、“年龄”,同时填充表格数据。其中,QTableWidgetItem类是QTableWidget表格控件中单元格的数据类。

2.2 设置单元格数据

我们可以通过QTableWidgetItem类来设置单元格的文本数据、背景色等,示例如下:

table_item = QTableWidgetItem('Jack')
table_item.setBackground(QColor(255, 0, 0)) # 设置单元格背景色为红色
table_widget.setItem(0, 0, table_item) # 在第一行第一列设置单元格

2.3 设置表头

表头包括垂直表头(列名)和水平表头(行名),可以通过以下方式设置:

header_labels = ['姓名', '性别', '年龄']
table_widget.setHorizontalHeaderLabels(header_labels) # 设置水平表头
table_widget.setVerticalHeaderLabels(header_labels) # 设置垂直表头

2.4 设置单元格对齐方式、列宽、行高

可以通过QTableWidgetItem类的属性设置单元格对齐方式、宽高:

table_item.setTextAlignment(QtCore.Qt.AlignCenter) # 设置单元格文本居中

table_widget.setColumnWidth(0, 100) # 设置第1列宽度为100
table_widget.setRowHeight(0, 30) # 设置第1行高度为30

三、示例说明

以下是两个使用QTableWidget的示例:

3.1 表格数据可编辑示例

这个示例演示如何让QTableWidget设置哪些单元格可编辑。

from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem

app = QApplication([])
table_widget = QTableWidget()
table_widget.setRowCount(5)
table_widget.setColumnCount(3)

header_labels = ['姓名', '性别', '年龄']
table_widget.setHorizontalHeaderLabels(header_labels)

for row in range(5):
    for col in range(3):
        cell_data = '({row}, {col})'.format(row=row+1, col=col+1)
        table_item = QTableWidgetItem(cell_data)
        if col == 0: # 第1列设置为可编辑状态
            table_item.setFlags(QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
        table_widget.setItem(row, col, table_item)

table_widget.show()
app.exec_()

在以上代码中,我们通过设置单元格的flags属性来决定哪些单元格可以编辑。通过QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled可同时实现单元格可编辑、可选中、可启用的设置。

3.2 表格数据可排序示例

这个示例演示如何在QTableWidget中表头上加入排序按钮,并可以自动对某一列数据进行排序。

from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QHeaderView
from PyQt5.QtCore import Qt

class TableWidgetWithSort(QTableWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setColumnCount(3)
        self.setRowCount(5)

        header_labels = ['姓名', '性别', '年龄']
        self.setHorizontalHeaderLabels(header_labels)

        for row in range(5):
            for col in range(3):
                cell_data = '({row}, {col})'.format(row=row+1, col=col+1)
                table_item = QTableWidgetItem(cell_data)
                self.setItem(row, col, table_item)

        # 每一列都可以排序,都加上QHeaderView.SortIndicator标识
        for col_idx in range(3):
            header_item = self.horizontalHeaderItem(col_idx)
            header_item.setText(header_item.text() + '  ▲') # 默认是升序
            header_item.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)
            header_item.setFlags(Qt.ItemIsEnabled)

        self.horizontalHeader().sectionClicked.connect(self.on_section_clicked)

    def on_section_clicked(self, col_idx):
        header_item = self.horizontalHeaderItem(col_idx)
        if '▲' in header_item.text():
            header_item.setText(header_item.text().replace('▲', '▼'))
            self.sortByColumn(col_idx, Qt.DescendingOrder)
        else:
            header_item.setText(header_item.text().replace('▼', '▲'))
            self.sortByColumn(col_idx, Qt.AscendingOrder)


app = QApplication([])
table_widget = TableWidgetWithSort()
table_widget.show()
app.exec_()

在以上代码中,我们继承了QTableWidget类,并覆写了部分方法,通过设置QHeaderView.SortIndicator标识后,表头上会出现小三角形,默认是升序。在点击表头时,根据当前表头的状态进行排序,并改变小三角形的方向。