2012-07-04 105 views
0

是否可以通过QTreeWidgetItem的数据列对PyQt QTreeWidget进行排序?按数据值对QTreeWidgetItem进行排序?

例如,我有一个目录列表,我想按照QTreeWidget中显示的磁盘大小进行排序,但不是显示结果(以字节为单位),而是使用一种方法将目录大小转换为兆字节/千兆字节,但仍然能够按照我存储在QTreeWidgetItem的数据插槽中的实际值对项目进行排序。

回答

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 
+0

真棒...工作,谢谢! – mfessenden