【问题标题】:How to sort a QTableWidget with my own code?如何用我自己的代码对 QTableWidget 进行排序?
【发布时间】:2011-01-19 05:43:43
【问题描述】:

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

然而,每当我点击表格的某个标题时,都会继续调用正常的排序方法。

如何覆盖它?

【问题讨论】:

    标签: qt sorting pyqt qt4 qtableview


    【解决方案1】:

    您可以派生自己的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__ 在我有~15 行时被调用了100 多次,即使我没有' t 单击该列的标题对其进行排序。更大的问题是它在这种情况下无法正确排序。几行混在一起就是这样,但是当我单击标题时效果很好。在重载__lt__ 时是否有一些我们通过的阻塞功能?
    猜你喜欢
    • 1970-01-01
    • 2018-10-18
    • 2019-08-05
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多