Python TableWidget 自动排序
TableWidget 是 PyQt5 中一个常用的控件,用于显示和编辑表格形式的数据。对于需要对表格数据进行排序的情况,TableWidget 提供了一些方法和信号可以方便地实现自动排序的功能。
在本文中,我们将详细讨论如何使用 Python 和 PyQt5 创建一个带有自动排序功能的表格应用。
目录
- PyQt5 基础知识
- 创建 TableWidget
- 添加排序功能
- 按列排序
- 按行排序
- 示例代码运行结果
- 总结
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 函数实现。