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

标签 qt sorting pyqt qt4 qtableview

我在 Linux 上使用 Qt4.5.2。我有一个简单的 QTableWidget,其中一列以人类友好的格式显示日期。不幸的是,“人类友好的日期”不容易正确排序。因此,在 QTableWidget 中,我保留了一个隐藏列,其中包含与该日期对应的 UNIX 时间戳。

我试图确保,每当发出对 DATE 列进行排序的请求时,实际上都会对(不可见的)TIMESTAMP 列进行排序。我尝试通过从 QTableWidget 子类化并定义来重新实现 sortByColumn (这是在 Python 中):

   def sortByColumn(self, col, order):
       print 'got request to sort col %d in order %s' % (col, str(order) )

但是,每当我单击表的标题之一时,都会继续调用正常的排序方法。

如何覆盖它?

最佳答案

您可以派生您自己的QTableWidgetItem 类,然后编写您自己的__lt__ 运算符。这也将减少对额外列的需要。大致如下:

from PyQt4 import QtCore, QtGui
import sys
import datetime

class MyTableWidgetItem(QtGui.QTableWidgetItem):
    def __init__(self, text, sortKey):
        #call custom constructor with UserType item type
        QtGui.QTableWidgetItem.__init__(self, text, QtGui.QTableWidgetItem.UserType)
        self.sortKey = sortKey

    #Qt uses a simple < check for sorting items, override this to use the sortKey
    def __lt__(self, other):
        return self.sortKey < other.sortKey

app = QtGui.QApplication(sys.argv)
window = QtGui.QMainWindow()
window.setGeometry(0, 0, 400, 400)

table = QtGui.QTableWidget(window)
table.setGeometry(0, 0, 400, 400)
table.setRowCount(3)
table.setColumnCount(1)

date1 = datetime.date.today()
date2 = datetime.date.today() + datetime.timedelta(days=1)
date3 = datetime.date.today() + datetime.timedelta(days=2)

item1 = MyTableWidgetItem(str(date1.strftime("%A %d. %B %Y")), str(date1))
item2 = MyTableWidgetItem(str(date2.strftime("%A %d. %B %Y")), str(date2))
item3 = MyTableWidgetItem(str(date3.strftime("%A %d. %B %Y")), str(date3))

table.setItem(0, 0, item1)
table.setItem(2, 0, item2)
table.setItem(1, 0, item3)
table.setSortingEnabled(True)

window.show()
sys.exit(app.exec_())

这对我来说产生了正确的结果,您可以自己运行来验证。单元格文本显示类似“Saturday 20. February 2010”的文本,但当您对列进行排序时,它将按 sortKey 字段正确排序,即“2010-02-20”(iso 格式)。

哦,还应该注意的是,这不适用于 PySide,因为 __lt__ 运算符似乎未绑定(bind),而与 PyQt4 一样。我花了一段时间尝试调试为什么它不起作用,然后我从 PySide 切换到 PyQt4,它工作得很好。您可能会注意到此处未列出 __lt__:

http://www.pyside.org/docs/pyside/PySide/QtGui/QTableWidgetItem.html

但它在这里:

http://doc.qt.digia.com/4.5/qtablewidgetitem.html#operator-lt

关于qt - 如何用我自己的代码对 QTableWidget 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2304199/

相关文章:

python - 如何阻止 QTreeWidget 移动滚动位置?

python - QGraphicsView 未在 QMainWindow 中显示

python - PyQt5,向选项卡添加文本不起作用

python - 如何让任务栏在 PyQt4 中显示我的进度条?

c++ - QStandardItemModel 最有效的行删除策略

c++ - Qt线程设计生产者消费者

c - 在 C 中,使用函数对数组进行排序而不使用指针是行不通的。为什么?

javascript - 对不包括零索引的数组中的 CSV 字符串进行排序

algorithm - GPU 上的线性排序。并行处理会改变 Big-O 吗?

python - PySide2 拖放功能不起作用