Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QTreeWidget insertTopLevelItem-给定的索引未准确显示在树中?_Python_Qt_Pyqt_Qtreewidget_Qtreewidgetitem - Fatal编程技术网

Python QTreeWidget insertTopLevelItem-给定的索引未准确显示在树中?

Python 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:

我无法在特定索引处正确插入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: ', 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()以恢复原来的值

问题