Сортировать QTreeWidgetItem по значению данных?

Можно ли отсортировать PyQt QTreeWidget по столбцу данных QTreeWidgetItem?

Например, у меня есть список каталогов, которые я хочу отсортировать по размеру на диске, отображаемом в QTreeWidget, но вместо отображения результатов (в байтах) я использую метод для преобразования размера каталога в мегабайты/гигабайты, но все же иметь возможность сортировать элементы по фактическому значению, которое я сохранил в слоте данных QTreeWidgetItem.


person mfessenden    schedule 04.07.2012    source источник


Ответы (1)


Да, я часто сталкивался с этим. Я всегда думал, что теоретически делаю что-то вроде:

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
person Eric Hulser    schedule 01.08.2012