如何在PySide2 TableView中实现点击列头调用自定义排序算法
PySide2 QTableView 自定义列排序实现方案
QTableView 采用 MVC 架构,排序逻辑由绑定的模型/代理模型负责,无法直接给 sortByColumn 传入自定义排序函数,你需要通过自定义QSortFilterProxyModel子类重写排序规则实现需求,具体步骤如下:
步骤1:自定义排序代理类
继承QSortFilterProxyModel,重写lessThan方法,在方法内实现你的自定义排序逻辑:
from PySide2.QtCore import QSortFilterProxyModel, Qt, QModelIndex class CustomSortProxy(QSortFilterProxyModel): def lessThan(self, left: QModelIndex, right: QModelIndex) -> bool: # 按当前排序的列号走不同的逻辑,也可以自定义属性动态切换排序规则 sort_column = self.sortColumn() # 示例:第0列按数值排序(修正默认字符串排序下10排在2前面的问题) if sort_column == 0: left_val = int(left.data(Qt.DisplayRole)) right_val = int(right.data(Qt.DisplayRole)) return left_val < right_val # 示例:第1列按字符串忽略大小写排序 elif sort_column == 1: left_val = left.data(Qt.DisplayRole).lower() right_val = right.data(Qt.DisplayRole).lower() return left_val < right_val # 其他列走默认排序逻辑 return super().lessThan(left, right)
如果需要动态切换多套排序规则,可以给这个代理类加自定义属性,lessThan内根据属性值选择不同的比较逻辑即可。
步骤2:给TableView绑定自定义代理
在界面初始化时,将自定义代理挂载到TableView和原数据模型之间:
# 1. 初始化你的原数据模型(比如QStandardItemModel,或者你自定义的其他QAbstractItemModel子类) self.source_model = QStandardItemModel() # (这里省略给source_model填充数据的逻辑) # 2. 初始化自定义排序代理,绑定原模型 self.sort_proxy = CustomSortProxy() self.sort_proxy.setSourceModel(self.source_model) # 3. 给TableView设置代理模型,开启排序支持 self.tableView.setModel(self.sort_proxy) self.tableView.setSortingEnabled(True) # 开启后点击列头会自动触发排序
步骤3:调用排序
完成绑定后,原有sortByColumn的调用方式不需要修改,内部会自动走你写的自定义排序逻辑:
# 调用后会使用CustomSortProxy里的规则排序 self.tableView.sortByColumn(0, Qt.AscendingOrder)
内容的提问来源于stack exchange,提问作者masky007
相关产品推荐
相关产品推荐

