<p>你可以做你的自定义排序,而不需要重新填充树。你只需要重载item的“less”操作符。
注意,QT通过在item中查找,计算出在单元格中绘制什么,它应该是什么大小,它应该包含什么文本</p>
<pre><code>virtual QVariant data ( int column, int role ) const
</code></pre>
<p>当您创建一个项时,您需要向构造函数提供一些字符串以显示该项。将此字符串放入数据(。。,QtCore.Qt.EditRole),因此,将数据传递到constructor的等效方法是使用以下内容设置数据:</p>
^{pr2}$
<p>在内部,数据只是一个数组,你可以放置任何你想要的东西,它的索引就是角色(Qt.EditRole是2,Qt.ToolTipRole是3等),所以我们只让某个角色包含我们的数据,告诉比较运算符比较这些值,并在设置ValueRole时告诉setData set DisplayRole。这是样品:</p>
<pre><code>class TreeItem(QtGui.QTreeWidgetItem):
PythonValueRole = QtCore.Qt.UserRole
#values are list of python objects, that have __str__ and can be compared
def __init__(self, tree, values):
QtGui.QTreeWidgetItem.__init__(self, tree)
i = 0
for v in values:
self.setData(i, TreeItem.PythonValueRole, v)
i += 1
#overridden to simplify data assigning. When called with PythonValueRole, passes
#that object's string representation to DisplayRole and EditRole
def setData(self, col, role, value):
if role == TreeItem.PythonValueRole:
QtGui.QTreeWidgetItem.setData(self, col, TreeItem.PythonValueRole, value)
# sets DisplayRole and EditRole
QtGui.QTreeWidgetItem.setData(self, col, QtCore.Qt.EditRole, str(value))
QtGui.QTreeWidgetItem.setData(self, col, QtCore.Qt.DisplayRole, str(value))
else:
QtGui.QTreeWidgetItem.setData(self, col, role, value)
def __lt__(self, other):
c = self.treeWidget().sortColumn()
return self.data(c, TreeItem.PythonValueRole).toPyObject() <
other.data(c, TreeItem.PythonValueRole).toPyObject()
</code></pre>
<p>我试过了,效果很好。当然,您可以避免继承和直接重写<strong>lt</strong>,因为我们有duck类型,所以使用UserRole本身来保存数据,而set data确实直接与setData(col、role、val)一起显示,甚至在edit/display角色中只保存文本,只在datetime中转换,但这看起来很难看。
注意,data()包含QVariant。当您设置数据时,py对象会自动转换,您需要调用toPyObject()来恢复原来的值。在</p>