关于qt:如何使用我自己的代码对QTableWidget进行排序?

How to sort a QTableWidget with my own code?

我在Linux上使用qt4.5.2。我有一个简单的qtablewidget,其中一列以人性化的格式显示日期。不幸的是,"人性友好的约会"不容易正确分类。因此,在qtablewidget中,我保留了一个隐藏列,其中包含与该日期对应的unix时间戳。

我试图确保,每当发出对日期列进行排序的请求时,实际上,排序是在(不可见的)时间戳列上进行的。我尝试通过从qtablewidget子类化并定义:

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

然而,每当我单击表的其中一个标题时,仍然会继续调用普通排序方法。

我怎样才能覆盖它?


您可以派生自己的EDOCX1类〔0〕,然后编写自己的__lt__操作符。这也将减少对额外列的需求。沿着这条线的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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_())

这为我产生了正确的结果,你可以自己运行它来验证。单元格文本显示类似"星期六20"的文本。2010年2月",但当您对列进行排序时,它将按照"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