【问题标题】:Sorting numeric column in QTableWidget对 QTableWidget 中的数字列进行排序
【发布时间】:2020-09-21 19:13:28
【问题描述】:

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

这是在排序之前

这是排序后的

【问题讨论】:

    标签: python pyqt pyqt5 qtablewidget


    【解决方案1】:

    问题是在 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, 0, 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, 0, it)
      
      w.resize(640, 480)
      w.show()
      
      sys.exit(app.exec_())
      

    【讨论】:

    • 非常感谢您的回复。我尝试了您的解决方案,但效果不佳,实际上,这些数字是从数据库中调用的,可能缺少某些数字。这是您的解决方案的结果:ibb.co/mz4gjX9
    • @AnhTu 1) 您尝试过以下两个选项中的哪一个? 2)如果您需要帮助,则必须提供minimal reproducible example
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多