Python:QTableWidget中的数字排序

时间:2012-10-01 12:48:37

标签: python sorting pyqt qtablewidget

我需要将我的QTableWidget的第一列填充为:行:1,行:2 ...行:100, 但排序不能按预期工作(数字)。 使用此代码排序工作正常,但我没有得到预期的文本:

for i in range(0, self.rows):
    item = QtGui.QTableWidgetItem()
    item.setData(Qt.DisplayRole, "Row: %s" %(i) )
    item.setData(Qt.EditRole, i)
    self.ui.tableWidget.setItem(i, 0, item)

我得到:1,2,3,4 ......而不是行:1,行:2,行:3 ...... 我期望EditRole将用于编辑目的(用于数字排序,它工作正常)但我也期望显示文本,因为它是使用DisplayRole设置的。 我能以某种方式这样做,或者为了排序而编写函数是唯一的方法吗?

2 个答案:

答案 0 :(得分:7)

对于QTableWidgetItemQt.DisplayRoleQt.EditRole的处理方式相同。

这意味着,在代码中:

item.setData(Qt.DisplayRole, "Row: %s" %(i) )
item.setData(Qt.EditRole, i)

第二行将简单地覆盖第一行中的数据集。因此,实际上没有单独的EditRole(除非重新实现datasetData函数)。

更改排序行为的标准方法是重新实现QTableWidgetItem的小于运算符(默认情况下,硬编码使用DisplayRole数据进行排序)。

以下子类将重现Qt通常用于数字排序的内容:

class TableWidgetItem(QtGui.QTableWidgetItem):
    def __lt__(self, other):
        return (self.data(QtCore.Qt.UserRole).toLongLong() <
                other.data(QtCore.Qt.UserRole).toLongLong())

答案 1 :(得分:4)

我仍然感兴趣为什么DisplayRole和EditRole没有做到我所期望的,但我已经解决了这样的问题:

class MyTableWidgetItem(QtGui.QTableWidgetItem):
    def __init__(self, text, sortKey):
            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 

...填充表:

for i in range(0, self.rows):
    item = MyTableWidgetItem("Row: %s" %(i), i)
    self.ui.tableWidget.setItem(i, 1, item)