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〕,然后编写自己的
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格式)的
哦,还应该注意的是,这对PySide不起作用,因为似乎
http://www.pyside.org/docs/pyside/pyside/qtgui/qtablewidgetitem.html
但它在这里:
http://doc.qt.digia.com/4.5/qtablewidgetitem.html operator lt