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.修改后排序结果
第一列修改后排序结果如下图
第二列修改后排序结果如下图
第三列修改后排序结果如下图
提示
以上示例中没有纯数字列,纯数字列也适用以上方法。