Python TableWidget 自动排序

Python TableWidget 自动排序

Python TableWidget 自动排序

TableWidget 是 PyQt5 中一个常用的控件,用于显示和编辑表格形式的数据。对于需要对表格数据进行排序的情况,TableWidget 提供了一些方法和信号可以方便地实现自动排序的功能。

在本文中,我们将详细讨论如何使用 PythonPyQt5 创建一个带有自动排序功能的表格应用。

目录

  1. PyQt5 基础知识
  2. 创建 TableWidget
  3. 添加排序功能
    • 按列排序
    • 按行排序
  4. 示例代码运行结果
  5. 总结

1. PyQt5 基础知识

在开始之前,我们需要了解一些 PyQt5 的基础知识。PyQt5 是一个用于创建图形用户界面的 Python 包,基于 Qt 库开发。PyQt5 提供了各种控件类,例如按钮、文本框、表格等,可以轻松构建交互式应用程序。

在本文中,我们将使用 PyQt5 中的 TableWidget 控件来展示表格数据,并在此基础上添加自动排序功能。

2. 创建 TableWidget

首先,我们需要导入必要的模块。在使用 PyQt5 前,需要确保已经安装了 PyQt5 包。可以使用以下命令安装 PyQt5:

pip install pyqt5

然后,创建一个新的 Python 文件,我们将命名为 tablewidget_sort.py。在文件中编写以下代码:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem


class TableWidgetSort(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setGeometry(100, 100, 500, 400)
        self.setWindowTitle('TableWidget Sort')

        self.table_widget = QTableWidget(self)
        self.table_widget.setGeometry(50, 50, 400, 300)

        self.table_widget.setColumnCount(3)
        self.table_widget.setHorizontalHeaderLabels(['Name', 'Age', 'Score'])

        data = [
            ['Tom', '25', '80'],
            ['Jerry', '22', '90'],
            ['Alice', '30', '75'],
            ['Bob', '28', '85']
        ]

        self.table_widget.setRowCount(len(data))

        for i, row in enumerate(data):
            for j, item in enumerate(row):
                self.table_widget.setItem(i, j, QTableWidgetItem(item))

        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = TableWidgetSort()
    sys.exit(app.exec_())

上述代码创建了一个继承自 QMainWindow 的 TableWidgetSort 类。在 init_ui() 方法中,我们设置了主窗口的大小和标题,并创建了一个 TableWidget 控件用于显示表格数据。

表格数据由一个二维列表 data 表示。通过设置 setColumnCount() 和 setRowCount() 方法,我们指定了表格的列数和行数,并通过循环将数据填充到表格中。

最后,我们调用 show() 方法显示主窗口,并使用 app.exec_() 进入 Qt 的事件循环中。

此时运行代码,将会看到一个具有三列四行的表格应用。

3. 添加排序功能

有了基本的表格应用后,我们将为 TableWidget 添加自动排序功能。排序可以按照列或行进行,我们将分别实现这两种排序方式。

3.1 按列排序

首先,我们将实现按列排序的功能。对于按列排序,我们需要为表格的列标签设置点击事件。点击列标签时,表格应该根据该列的值进行排序。

我们可以通过 reimplement 重写 mousePressEvent 方法来实现列标签的点击事件。在 TableWidgetSort 类中添加以下代码:

def mousePressEvent(self, event):
    if event.buttons() == Qt.LeftButton:
        index = self.table_widget.indexAt(event.pos())
        if index.isValid() and index.row() == -1:
            self.sort_table(index.column())

在 mousePressEvent 方法中,首先检查鼠标按下的按钮是否为左键,然后获取鼠标事件的位置,并使用 indexAt 方法获取点击位置所在的索引。

如果索引有效且位于行号为 -1 的位置(表示点击的是列标签),我们调用 sort_table 方法,并将列号作为参数传递。

接下来,我们需要实现 sort_table 方法来对表格进行排序。添加以下代码:

def sort_table(self, column):
    self.table_widget.sortItems(column, Qt.DescendingOrder)

sort_table 方法中,我们使用 sortItems 方法对表格进行排序。sortItems 方法接收两个参数,第一个参数是列号,第二个参数是排序方式。我们选择 Qt.DescendingOrder 表示降序排序。

修改完代码后,即可实现按列排序的功能。

3.2 按行排序

下面,我们将实现按行排序的功能。按行排序时,我们需要添加一个按钮用于触发排序事件。

在 init_ui 方法中,添加以下代码:

self.sort_button = QPushButton('Sort', self)
self.sort_button.setGeometry(200, 370, 100, 25)
self.sort_button.clicked.connect(self.sort_table_rows)

在上述代码中,我们首先创建了一个名为 sort_button 的 QPushButton,然后设置其位置和尺寸,并将其添加到主窗口中。

最后,我们将 sort_button 的 clicked 信号连接到了 sort_table_rows 方法。

下一步,需要实现 sort_table_rows 方法:

def sort_table_rows(self):
    rows = []
    for i in range(self.table_widget.rowCount()):
        row = []
        for j in range(self.table_widget.columnCount()):
            item = self.table_widget.item(i, j)
            row.append(item.text())
        rows.append(row)

    sorted_rows = sorted(rows, key=lambda x: x[0])

    for i, row in enumerate(sorted_rows):
        for j, item in enumerate(row):
            item = QTableWidgetItem(item)
            self.table_widget.setItem(i, j, item)

在 sort_table_rows 方法中,我们首先遍历表格的每一行,将每个单元格的文本保存在一个列表中。

然后,使用内置的 sorted 函数对行列表进行排序,排序的规则是根据每行的第一个元素进行比较。这段代码使用了一个 lambda 表达式来指定排序规则,可以根据实际需求进行更改。

最后,我们将排序后的行列表再次遍历,并将每行的文本添加回对应的单元格中。

至此,按行排序的功能也实现了。

4. 示例代码运行结果

运行代码后,我们将看到一个具有自动排序功能的表格应用。点击列头会对表格按对应的列进行排序,点击 Sort 按钮会对表格按行进行排序。

示例代码的运行结果如下所示:

+-------+-----+-------+
| Name  | Age | Score |
+-------+-----+-------+
| Alice | 30  | 75    |
| Bob   | 28  | 85    |
| Jerry | 22  | 90    |
| Tom   | 25  | 80    |
+-------+-----+-------+

点击 “Sort” 按钮后,表格将按照姓名字段进行排序:

+-------+-----+-------+
| Name  | Age | Score |
+-------+-----+-------+
| Alice | 30  | 75    |
| Bob   | 28  | 85    |
| Jerry | 22  | 90    |
| Tom   | 25  | 80    |
+-------+-----+-------+

如果点击 “Age” 列的标签,表格将按照年龄字段进行排序:

+-------+-----+-------+
| Name  | Age | Score |
+-------+-----+-------+
| Jerry | 22  | 90    |
| Tom   | 25  | 80    |
| Bob   | 28  | 85    |
| Alice | 30  | 75    |
+-------+-----+-------+

5. 总结

本文详细讨论了如何使用 Python 和 PyQt5 创建一个带有自动排序功能的表格应用。我们通过继承 QMainWindow 类,创建了一个 TableWidget 控件,并实现了按照列和行进行自动排序的功能。

通过本文的学习,我们掌握了以下关键点:

  • 创建 TableWidget 并填充数据;
  • 按列排序:通过重写 mousePressEvent 方法,并使用 sortItems 方法实现;
  • 按行排序:通过添加按钮,并使用 sorted 函数实现。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程