qtablewidget多重排序
时间: 2023-10-18 15:06:28 浏览: 89
QTableWidget可以通过setSortingEnabled()方法开启排序功能,但是默认只支持单列排序。如果需要多列排序,可以通过自定义排序函数来实现。具体步骤如下:
1. 继承QTableWidgetItem类,重载小于号运算符(operator<),实现自定义排序规则。
2. 继承QTableWidget类,重载sortItems()方法,调用自定义排序函数进行多列排序。
下面是一个示例代码,实现了按照第一列升序、第二列降序的排序规则:
```python
from PyQt5.QtWidgets import QApplication, QTableWidget, QTableWidgetItem
class MyTableWidgetItem(QTableWidgetItem):
def __init__(self, text):
super().__init__(text)
def __lt__(self, other):
if isinstance(other, QTableWidgetItem):
return self.text() < other.text()
else:
return super().__lt__(other)
class MyTableWidget(QTableWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setColumnCount(2)
self.setRowCount(3)
self.setItem(0, 0, MyTableWidgetItem("3"))
self.setItem(0, 1, MyTableWidgetItem("2"))
self.setItem(1, 0, MyTableWidgetItem("1"))
self.setItem(1, 1, MyTableWidgetItem("4"))
self.setItem(2, 0, MyTableWidgetItem("2"))
self.setItem(2, 1, MyTableWidgetItem("3"))
self.setSortingEnabled(True)
def sortItems(self, column, order):
if column == 0:
super().sortItems(column, order)
else:
items = []
for row in range(self.rowCount()):
items.append((self.item(row, 0), self.item(row, 1)))
items.sort(key=lambda x: (x[0], -int(x[1].text()) if x[1].text().isdigit() else x[1].text()), reverse=order == 0)
for row in range(self.rowCount()):
self.setItem(row, 0, items[row][0])
self.setItem(row, 1, items[row][1])
if __name__ == '__main__':
app = QApplication([])
table = MyTableWidget()
table.show()
app.exec_()
```
阅读全文