如何从QTreeWidget、QListWidget或QListVi中删除多个项目

2024-09-24 22:32:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

indexesToDelete=[1, 3, 5 ,7]

如果我这么做了:

^{pr2}$

事情变得很糟糕。每次for itemIndex in indexesToDelete迭代都会删除一个项并更改树项的索引,即使for循环仍在继续。。。不用说,只有第一次for循环迭代才会删除正确的列表项。所有其他列表项都被不正确地删除。在

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


Tags: in列表for事情pr2qtreewidget树项itemindex
2条回答

因此,我想首先指出的是,实际上并不是通过QModelIndex删除,而是通过与特定项(或项行)关联的整数来删除。如果要删除的每个项目都有QModelIndexs,那么在第一次删除之后,当您查询index.isValid()时,所有索引都将返回False。这应该很有意义,很明显,当您删除一个项时,所有索引都将无效(正如您所发现的)。在

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

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

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

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()

^{pr2}$

相关问题 更多 >