我在Linux上使用Qt4.5.2。我有一个简单的QTableWidget,其中一个列以人类友好的格式显示日期。不幸的是,“人类友好的日期”并不容易正确排序。因此,在QTableWidget中,我保留了一个隐藏列,其中包含与该日期对应的UNIX时间戳。
我正在努力确保,无论何时发出对日期列进行排序的请求,实际上都是在(不可见的)时间戳列上进行排序。我尝试通过从QTableWidget继承子类并定义以下内容来重新实现sortByColumn (这是在Python语言中):
def sortByColumn(self, col, order):
print 'got request to sort col %d in order %s' % (col, str(order) )
然而,每当我单击表的一个标题时,就会继续调用正常的排序方法。
我怎样才能覆盖它?
发布于 2010-02-21 09:59:41
您可以派生自己的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_())
这为我产生了正确的结果,你可以自己运行它来验证。单元格文本显示类似于“星期六20. 2010年2月”的文本,但当您对列进行排序时,它将按照sortKey
字段"2010-02-20“(iso格式)进行正确排序。
哦,还应该指出的是,这不适用于PySide,因为它似乎没有绑定操作符,就像它在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
https://stackoverflow.com/questions/2304199
复制相似问题