Python QTreeWidget insertTopLevelItem-给定的索引未准确显示在树中?
我无法在特定索引处正确插入QTreeWidgetItem,在这种情况下,我将从树中删除所有QTreeWidgetItems,对它们的日期对象进行自定义排序,然后将它们插入回QTreeWidget 但是,在插入时(即使一次插入一个),QTreeWidgetItem也不会插入到正确的位置 下面的代码打印出来: 索引0:0 索引0:1索引1:0 索引0:2索引1:1索引2:0 指数0:3指数1:2指数2:0指数3:1 指数0:4指数1:2指数2:0指数3:1指数4:3Python QTreeWidget insertTopLevelItem-给定的索引未准确显示在树中?,python,qt,pyqt,qtreewidget,qtreewidgetitem,Python,Qt,Pyqt,Qtreewidget,Qtreewidgetitem,我无法在特定索引处正确插入QTreeWidgetItem,在这种情况下,我将从树中删除所有QTreeWidgetItems,对它们的日期对象进行自定义排序,然后将它们插入回QTreeWidget 但是,在插入时(即使一次插入一个),QTreeWidgetItem也不会插入到正确的位置 下面的代码打印出来: 索引0:0 索引0:1索引1:0 索引0:2索引1:1索引2:0 指数0:3指数1:2指数2:0指数3:1 指数0:4指数1:2指数2:0指数3:1指数4:3 print 'index 0:
print 'index 0: ', self.indexOfTopLevelItem(childrenList[0])
self.insertTopLevelItem(0, childrenList[1])
print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
self.indexOfTopLevelItem(childrenList[1])
self.insertTopLevelItem(0, childrenList[2])
print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
self.indexOfTopLevelItem(childrenList[1]), ' index 2: ', \
self.indexOfTopLevelItem(childrenList[2])
self.insertTopLevelItem(0, childrenList[3])
print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]), ' index 1: ',\
self.indexOfTopLevelItem(childrenList[1]), ' index 2: ',\
self.indexOfTopLevelItem(childrenList[2]), 'index 3: ',\
self.indexOfTopLevelItem(childrenList[3])
self.insertTopLevelItem(0, childrenList[4])
print 'index 0: ', self.indexOfTopLevelItem(childrenList[0]),\
' index 1: ', self.indexOfTopLevelItem(childrenList[1]),\
' index 2: ', self.indexOfTopLevelItem(childrenList[2]),\
'index 3: ', self.indexOfTopLevelItem(childrenList[3]),\
'index 4: ', self.indexOfTopLevelItem(childrenList[4])
您可以进行自定义排序,而无需重新填充树。您只需要重载项的“less”操作符。 请注意,QT通过查看项的
virtual QVariant data ( int column, int role ) const
创建项时,向构造函数提供要显示的项的字符串。该字符串被放入数据(..,QtCore.Qt.EditRole)中,因此,将数据传递到构造函数的等效方法是使用以下参数设置数据:
virtual void setData ( int column, int role, const QVariant & value)
在内部,数据只是一个数组,你可以放置任何你想要的东西,它的索引是角色(Qt.EditRole是2,Qt.ToolTipRole是3等等),所以我们只让一些角色包含我们的数据,告诉比较运算符比较这些值,并告诉setData set DisplayRole当我们设置ValueRole时。以下是示例:
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()
类树项(QtGui.QTreeWidgetItem):
PythonValueRole=QtCore.Qt.UserRole
#值是python对象的列表,这些对象具有_str__,并且可以进行比较
定义初始化(自、树、值):
QtGui.QTreeWidgetItem.\uuuuu init\uuuuuu(self,tree)
i=0
对于v值:
self.setData(i,TreeItem.PythonValueRole,v)
i+=1
#重写以简化数据分配。当使用PythonValueRole调用时,传递
#该对象的字符串表示形式为DisplayRole和EditRole
def setData(自身、列、角色、值):
如果角色==TreeItem.pythonValue角色:
QtGui.QTreeWidgetItem.setData(self、col、TreeItem.PythonValueRole、value)
#设置DisplayRole和EditRole
setData(self、col、QtCore.Qt.EditRole、str(value))
setData(self、col、QtCore.Qt.DisplayRole、str(value))
其他:
QtGui.QTreeWidgetItem.setData(self、col、role、value)
定义(自身、其他):
c=self.treeWidget().sortColumn()
返回self.data(c,TreeItem.PythonValueRole).toPyObject()
其他.data(c,TreeItem.PythonValueRole).toPyObject()
我已经测试过了,效果很好。当然,您可以避免继承并直接重写lt,因为我们有duck类型,使用UserRole本身保存数据,并使用setData(col、role、val)直接显示设置数据,甚至在编辑/显示角色中仅保存文本,在比较时仅在datetime中转换,但这看起来很难看。
注意,data()包含QVariant。设置数据时,py对象会自动转换,需要调用toPyObject()以恢复原来的值 您可以进行自定义排序,而无需重新填充树。您只需要重载项的“less”操作符。 请注意,QT通过查看项的
virtual QVariant data ( int column, int role ) const
创建项时,向构造函数提供要显示的项的字符串。该字符串被放入数据(..,QtCore.Qt.EditRole)中,因此,将数据传递到构造函数的等效方法是使用以下参数设置数据:
virtual void setData ( int column, int role, const QVariant & value)
在内部,数据只是一个数组,你可以放置任何你想要的东西,它的索引是角色(Qt.EditRole是2,Qt.ToolTipRole是3等等),所以我们只让一些角色包含我们的数据,告诉比较运算符比较这些值,并告诉setData set DisplayRole当我们设置ValueRole时。以下是示例:
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()
类树项(QtGui.QTreeWidgetItem):
PythonValueRole=QtCore.Qt.UserRole
#值是python对象的列表,这些对象具有_str__,并且可以进行比较
定义初始化(自、树、值):
QtGui.QTreeWidgetItem.\uuuuu init\uuuuuu(self,tree)
i=0
对于v值:
self.setData(i,TreeItem.PythonValueRole,v)
i+=1
#重写以简化数据分配。当使用PythonValueRole调用时,传递
#该对象的字符串表示形式为DisplayRole和EditRole
def setData(自身、列、角色、值):
如果角色==TreeItem.pythonValue角色:
QtGui.QTreeWidgetItem.setData(self、col、TreeItem.PythonValueRole、value)
#设置DisplayRole和EditRole
setData(self、col、QtCore.Qt.EditRole、str(value))
setData(self、col、QtCore.Qt.DisplayRole、str(value))
其他:
QtGui.QTreeWidgetItem.setData(self、col、role、value)
定义(自身、其他):
c=self.treeWidget().sortColumn()
返回self.data(c,TreeItem.PythonValueRole).toPyObject()
其他.data(c,TreeItem.PythonValueRole).toPyObject()
我已经测试过了,效果很好。当然,您可以避免继承并直接重写lt,因为我们有duck类型,使用UserRole本身保存数据,并使用setData(col、role、val)直接显示设置数据,甚至在编辑/显示角色中仅保存文本,在比较时仅在datetime中转换,但这看起来很难看。
注意,data()包含QVariant。设置数据时,py对象会自动转换,需要调用toPyObject()以恢复原来的值 问题