对 QTableWidget 中的数字列进行排序

Posted

技术标签:

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

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

这是在排序之前

这是排序后的

【问题讨论】:

【参考方案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

以上是关于对 QTableWidget 中的数字列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单击列的标题按列对 QTableWidget 进行排序?

如何用我自己的代码对 QTableWidget 进行排序?

QTableWidget 中的自定义排序

基于多个列对包含numpy文本数组中的数字的列进行排序

Python对多列文件中的数字进行排序[重复]

列标签的 QTableWidget 排序