在QTableWidget

问题描述

我正在尝试使用PyQT5在QTableWidget中对数字列进行排序。我阅读了一些示例,并尝试了一下,但是效果不是很好。 它总是会返回相同的结果。

这是在排序之前

Before sorting

这是经过排序的

After sorting

解决方法

问题是在QTableWidgetItem中使用字符串而不是数字。鉴于此,有几种选择:

  • 存储数字而不是字符串:

    import sys
      from PyQt5 import QtCore,QtWidgets
    
    
      app = QtWidgets.QApplication(sys.argv)
    
      w = QtWidgets.QTableWidget(100,1)
      w.setSortingEnabled(True)
    
      for i in range(w.rowCount()):
          it = QtWidgets.QTableWidgetItem()
          it.setData(QtCore.Qt.DisplayRole,i)
          w.setItem(i,it)
    
      w.resize(640,480)
      w.show()
    
      sys.exit(app.exec_())
  • 重写QTableWidgetItem的__lt__方法:

    import sys
    from PyQt5 import QtWidgets
    
    
    class TableWidgetItem(QtWidgets.QTableWidgetItem):
        def __lt__(self,other):
            try:
                return float(self.text()) < float(other.text())
            except ValueError:
                return super().__lt__(other)
    
    
    app = QtWidgets.QApplication(sys.argv)
    
    w = QtWidgets.QTableWidget(100,1)
    w.setSortingEnabled(True)
    
    for i in range(w.rowCount()):
        it = TableWidgetItem(str(i))
        w.setItem(i,it)
    
    w.resize(640,480)
    w.show()
    
    sys.exit(app.exec_())