PyQt5 之 QTableWidget 数字和字符混合的列排序

PyQt5 之 QTableWidget 数字和字符混合的列排序


前言

PyQt5中的QTableWidget 是按照string类型进行排序的,所以遇到数字或数字和字符混合的情况,排序的结果就和预期不太一样,这里记录下如何解决此问题


一、QTableWidget 自带排序

1.完整示例代码

import sys
from PyQt5 import QtCore, QtWidgets

class Window(QtWidgets.QTableWidget):
    def __init__(self):
        super(Window, self).__init__(6, 3)
        for column, values in enumerate((
            ('第1天', '第350天', '第100天', '第10天', '第2天', '第30天'),
            ("1天", "10天", "20天","2天", "100天", "30天"),
            ('1天5小时', "10天5小时", "10天6小时", "20天5小时", "30天3小时", "2天1小时"),
            )):
            for row, value in enumerate(values):
                item = QtWidgets.QTableWidgetItem(value)
                self.setItem(row, column, item)
        self.setSortingEnabled(True)
  
if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 350, 250)
    window.show()
    sys.exit(app.exec_())

2.排序结果

第一列排序结果如下图
在这里插入图片描述
第二列排序结果如下图
在这里插入图片描述
第三节排序结果如下图
在这里插入图片描述
以上排序结果和我们预期的不太一样。

二、解决措施

1.新建一个类

类代码如下:

class SortItem(QtWidgets.QTableWidgetItem):
    def __lt__(self, other):
        collator=QtCore.QCollator()
        collator.setNumericMode(True)
        res=collator.compare(self.text(),other.text())
        if res<0:
            return True
        else:
            return False

2.修改局部示例代码

只需对item的赋值进行修改如下:

item = SortItem(str(value))

3.修改后完整示例代码

import sys
from PyQt5 import QtCore, QtWidgets

class SortItem(QtWidgets.QTableWidgetItem):
    def __lt__(self, other):
        collator=QtCore.QCollator()
        collator.setNumericMode(True)
        res=collator.compare(self.text(),other.text())
        if res<0:
            return True
        else:
            return False

class Window(QtWidgets.QTableWidget):
    def __init__(self):
        super(Window, self).__init__(6, 3)
        for column, values in enumerate((
            ('第1天', '第350天', '第100天', '第10天', '第2天', '第30天'),
            ("1天", "10天", "20天","2天", "100天", "30天"),
            ('1天5小时', "10天5小时", "10天6小时", "20天5小时", "30天3小时", "2天1小时"),
            )):
            for row, value in enumerate(values):
                # item = QtWidgets.QTableWidgetItem(value)
                item = SortItem(str(value))
                self.setItem(row, column, item)
        self.setSortingEnabled(True)
  
if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 350, 250)
    window.show()
    sys.exit(app.exec_())

3.修改后排序结果

第一列修改后排序结果如下图
在这里插入图片描述
第二列修改后排序结果如下图
在这里插入图片描述
第三列修改后排序结果如下图
在这里插入图片描述


提示

以上示例中没有纯数字列,纯数字列也适用以上方法。

猜你喜欢

转载自blog.csdn.net/Bluma/article/details/128991861
今日推荐