2012-07-04 4 views
0

Возможно ли сортировать PyQt QTreeWidget по столбцу данных QTreeWidgetItem?Сортировка 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

awesome ... это сработало, спасибо! – mfessenden