是否可以通过QTreeWidgetItem的数据列对PyQt QTreeWidget进行排序?
例如,我有一个目录列表,我希望按照QTreeWidget中显示的磁盘大小排序,但不是显示结果(以字节为单位),而是使用一种方法将目录大小转换为兆字节/千兆字节,但仍然能够按实际值对项目进行排序,我已将其存储在QTreeWidgetItem的数据槽中。
答案 0 :(得分:4)
是的,我遇到了很多。我一直认为理论上做的事情如下:
item = QTreeWidgetItem()
item.setData(0, Qt.EditRole, QVariant(1024))
item.setData(0, Qt.DisplayRole, '1 Kb')
应该工作......不幸的是它没有。让它工作的唯一真正方法是继承QTreeWidgetItem,并以自己的方式存储您的排序信息,或使用Qt.UserRole与EditRole或DisplayRole:
class MyTreeWidgetItem(QTreeWidgetItem):
def __lt__( self, other ):
if ( not isinstance(other, MyTreeWidgetItem) ):
return super(MyTreeWidgetItem, self).__lt__(other)
tree = self.treeWidget()
if ( not tree ):
column = 0
else:
column = tree.sortColumn()
return self.sortData(column) < other.sortData(column)
def __init__( self, *args ):
super(MyTreeWidgetItem, self).__init__(*args)
self._sortData = {}
def sortData( self, column ):
return self._sortData.get(column, self.text(column))
def setSortData( self, column, data ):
self._sortData[column] = data
因此,在这种情况下使用它与以前类似,但实际上允许通过自定义数据进行排序:
item = MyTreeWidgetItem()
item.setSortData(0, 1024)
item.setText(0, '1 kb')01