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

6

我正在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) )

然而,每当我点击表格标题时,仍然会调用常规的排序方法。

我该如何覆盖它?

1个回答

8
你可以派生自己的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”的文本,但是当您按列排序时,它将按照“2010-02-20”(iso格式)正确排序,该字段为sortKey
哦,还应该注意到这在PySide中不起作用,因为似乎__lt__操作符未绑定,而在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


嗨,这真的帮了我很多。我需要自己的__lt__运算符,以便可以在第一列中对可选表格小部件项进行排序,但现在当我使用tableWidget.setSortingEnabled(1)时,由于某种原因,即使我没有单击要对其进行排序的列的标题,__lt__也会被调用100多次,即使我只有约15行。更大的问题是,在这种情况下它不能正确地排序。只是几行混合在一起,但当我点击标题时它就能正常工作。 我们在重载__lt__时是否传递了某些阻塞功能? - Aleksandar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接