我需要将我的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设置的。 我能以某种方式这样做,或者为了排序而编写函数是唯一的方法吗?
答案 0 :(得分:7)
对于QTableWidgetItem
,Qt.DisplayRole
和Qt.EditRole
的处理方式相同。
这意味着,在代码中:
item.setData(Qt.DisplayRole, "Row: %s" %(i) )
item.setData(Qt.EditRole, i)
第二行将简单地覆盖第一行中的数据集。因此,实际上没有单独的EditRole
(除非重新实现data
和setData
函数)。
更改排序行为的标准方法是重新实现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)