Sorting 是否按数据值对QTreeWidgetItem排序?
是否可以按QTreeWidgetItem的数据列对PyQt QTreeWidget进行排序Sorting 是否按数据值对QTreeWidgetItem排序?,sorting,pyqt,qtreewidget,qtreewidgetitem,Sorting,Pyqt,Qtreewidget,Qtreewidgetitem,是否可以按QTreeWidgetItem的数据列对PyQt QTreeWidget进行排序 例如,我在QTreeWidget中显示了一个我想在磁盘上按大小排序的目录列表,但我没有显示结果(以字节为单位),而是使用一种方法将目录大小转换为兆字节/千兆字节,但仍然能够按实际值对项目进行排序,我已将其存储在QTreeWidgetItem的数据槽中。是,我经常遇到这种情况。我一直认为,从理论上讲,做一些事情,比如: item = QTreeWidgetItem() item.setData(0, Qt.
例如,我在QTreeWidget中显示了一个我想在磁盘上按大小排序的目录列表,但我没有显示结果(以字节为单位),而是使用一种方法将目录大小转换为兆字节/千兆字节,但仍然能够按实际值对项目进行排序,我已将其存储在QTreeWidgetItem的数据槽中。是,我经常遇到这种情况。我一直认为,从理论上讲,做一些事情,比如:
item = QTreeWidgetItem()
item.setData(0, Qt.EditRole, QVariant(1024))
item.setData(0, Qt.DisplayRole, '1 Kb')
应该行得通……不幸的是不行。使其工作的唯一真正方法是对QTreeWidgetItem进行子类化,并以自己的方式存储排序信息,或者使用Qt.UserRole vs.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 = QTreeWidgetItem()
item.setData(0, Qt.EditRole, QVariant(1024))
item.setData(0, Qt.DisplayRole, '1 Kb')
应该行得通……不幸的是不行。使其工作的唯一真正方法是对QTreeWidgetItem进行子类化,并以自己的方式存储排序信息,或者使用Qt.UserRole vs.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