2

我需要将 QTableWidget 的第一列填充为: Row: 1, Row: 2...Row: 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... 而不是 Row: 1, Row: 2, Row: 3... 我希望 EditRole 将用于编辑目的(用于数字排序,效果很好)但我还期望显示文本,因为它是使用 DisplayRole 设置的。我可以以某种方式做到这一点,或者为排序目的编写函数是唯一的方法吗?

4

2 回答 2

7

对于QTableWidgetItem,Qt.DisplayRoleQt.EditRole的处理方式相同。

这意味着,在代码中:

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

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

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

以下子类将重现 Qt 通常对数字排序所做的事情:

class TableWidgetItem(QtGui.QTableWidgetItem):
    def __lt__(self, other):
        return (self.data(QtCore.Qt.UserRole).toLongLong() <
                other.data(QtCore.Qt.UserRole).toLongLong())
于 2012-10-01T15:10:44.213 回答
5

我仍然对为什么 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)
于 2012-10-01T13:33:26.693 回答