按数据值对 QTreeWidgetItem 进行排序?

mfe*_*den 0 sorting pyqt qtreewidget qtreewidgetitem

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

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

Eri*_*ser 5

是的,我遇到过很多这种情况。我一直认为理论上做这样的事情:

item = QTreeWidgetItem()
item.setData(0, Qt.EditRole, QVariant(1024))
item.setData(0, Qt.DisplayRole, '1 Kb')
Run Code Online (Sandbox Code Playgroud)

应该工作......不幸的是它没有。让它工作的唯一真正方法是将 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
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下使用它与之前类似,但实际上允许通过自定义数据进行排序:

item = MyTreeWidgetItem()
item.setSortData(0, 1024)
item.setText(0, '1 kb')01
Run Code Online (Sandbox Code Playgroud)