PyQt QTreeWidget を QTreeWidgetItem のデータ列でソートすることは可能ですか?
たとえば、QTreeWidget に表示されるディスク上のサイズで並べ替えたいディレクトリのリストがありますが、結果 (バイト単位) を表示する代わりに、ディレクトリ サイズをメガバイト/ギガバイトに変換する方法を使用しますが、それでもQTreeWidgetItem のデータ スロットに保存した実際の値で項目を並べ替えることができます。
PyQt QTreeWidget を QTreeWidgetItem のデータ列でソートすることは可能ですか?
たとえば、QTreeWidget に表示されるディスク上のサイズで並べ替えたいディレクトリのリストがありますが、結果 (バイト単位) を表示する代わりに、ディレクトリ サイズをメガバイト/ギガバイトに変換する方法を使用しますが、それでもQTreeWidgetItem のデータ スロットに保存した実際の値で項目を並べ替えることができます。
ええ、私はこれにたくさん出くわしました。私はいつも、理論的には次のようなことをしていると思っていました:
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