QTableWidget排序

有的时候想实现点击QTableWidget的表头就能实现排序的效果,一直没有找到合适的资料,前两天无意间发现这个功能了,以下是实现代码

Python
import sys  
from PyQt5.QtWidgets import *  
from PyQt5.QtCore import *  


class ColumnSort(QWidget):  
    def __init__(self):  
        super(ColumnSort, self).__init__()  
        self.initUI()  

    def initUI(self):  
        self.setWindowTitle('按列排序')  
        self.resize(430, 230)  
        layout = QVBoxLayout()  
        self.tableWidget = QTableWidget()  
        self.tableWidget.setSortingEnabled(True)
        # 这里是核心功能,将这里设置成True,这样运行的时候就可以点击表头排序了
        self.tableWidget.setRowCount(4)  
        self.tableWidget.setColumnCount(3)  
        layout.addWidget(self.tableWidget)  

        self.tableWidget.setHorizontalHeaderLabels(['姓名', '性别', '体重(kg)'])  

        newItem = QTableWidgetItem('张三')  
        self.tableWidget.setItem(0, 0, newItem)  

        newItem = QTableWidgetItem('男')  
        self.tableWidget.setItem(0, 1, newItem)  

        newItem = QTableWidgetItem('165')  
        self.tableWidget.setItem(0, 2, newItem)  

        newItem = QTableWidgetItem('李四')  
        self.tableWidget.setItem(1, 0, newItem)  

        newItem = QTableWidgetItem('女')  
        self.tableWidget.setItem(1, 1, newItem)  

        newItem = QTableWidgetItem('160')  
        self.tableWidget.setItem(1, 2, newItem)  

        newItem = QTableWidgetItem('王五')  
        self.tableWidget.setItem(2, 0, newItem)  

        newItem = QTableWidgetItem('男')  
        self.tableWidget.setItem(2, 1, newItem)  

        newItem = QTableWidgetItem('170')  
        self.tableWidget.setItem(2, 2, newItem)  
        self.setLayout(layout)  


if __name__ == '__main__':  
    app = QApplication(sys.argv)  
    main = ColumnSort()  
    main.show()  
    sys.exit(app.exec())

运行截图:

Pasted image 20230108211814.png

注意事项

有的时候使用排序功能,容易出现单元格数据丢失的情况,以后使用的时候需要注意,目前测试如果将列表中的数据写入到QTableWidget,且保留排序的功能,可以采取先临时禁用,修改数据之后再启用

另外,如果数据是从列表导入到QTableWidget中,如果列表的内容发生改变,需要重新刷新QTableWidget数据,建议直接修改指定位置的的数据,而不是通过遍历刷新,一旦数据量比较大,会影响到性能