如何从QTreeWidget,QListWidget或QListView中删除多个项目

时间:2014-08-05 23:26:16

标签: python pyqt

我有一个QTreeWidget项目索引列表:

indexesToDelete=[1, 3, 5 ,7]

现在,如果我这样做:

for itemIndex in indexesToDelete:
    myTree.takeTopLevelItem(itemIndex) # deletes an item from Tree
事情变得非常讨厌。每次for itemIndex in indexesToDelete次迭代都会删除一个Item,并且即使for循环仍在进行,Tree Item的索引也会更改...不用说只有第一个for循环迭代才会删除正确的List项目。所有其他列表项都被不正确地删除。

问题:如何正确删除索引列表项?

2 个答案:

答案 0 :(得分:2)

一个想法是按项目删除而不是不断更改索引号。 首先构建要删除的项目列表。然后迭代树中的项目,将每个项目与存储在要删除项目列表中的项目进行比较。删除如果为真。

<强> QListWidget()

myListWidget=QtGui.QListWidget()

for i in range(10):
    item=QtGui.QtGui.QListWidgetItem()
    myListWidget.addItem(item)

indexToRemove=[2,4,6]

itemsToRemove=[]
for index in indexToRemove:
    item=myListWidget.item(index)
    if item: itemsToRemove.append(item)

for i in range(myListWidget.count()):
    listItem = myListWidget.item(i)
    if not listItem: continue
    if not listItem in itemsToRemove: continue                  
    itemRow=myListWidget.row(listItem)
    if itemRow:
        myListWidget.takeItem(itemRow)

<强> QTreeWidget()

myTreeWidget=QtGui.QTreeWidget()

for i in range(10):
    item=QtGui.QtGui.QTreeWidgetItem()
    myTreeWidget.addTopLevelItem(item)

indexToRemove=[2,4,6]

itemsToRemove=[]
for index in indexToRemove:
    item=myTreeWidget.topLevelItem(index)
    if item: itemsToRemove.append(item)

for i in range(myTreeWidget.topLevelItemCount()):
    listItem=myTreeWidget.topLevelItem(i)
    if not listItem: continue
    if not listItem in itemsToRemove: continue
    itemIndex=myTreeWidget.indexOfTopLevelItem(listItem)
    if not itemIndex: continue             
    myTreeWidget.takeTopLevelItem(itemIndex)

答案 1 :(得分:0)

所以我想首先指出你实际上没有用QModelIndex删除,而是用一个与特定项目(或项目行)相关联的整数。如果您想要删除的每个项目实际上都有QModelIndex s,您会发现在第一次删除后,当您查询False时,所有索引都会返回index.isValid()。这应该很有意义,显然当你删除一个项目时,所有索引都变得无效(正如你所发现的那样)。

简而言之,Qt应该有助于阻止你做你想做的事情!

唯一可靠解决方案是根据项目列表进行删除。如果需要(并通过索引删除),您可以在删除循环的每次迭代中从项目中查找项目索引,但是您无法存储索引列表并希望删除正常工作。