我有一个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项目。所有其他列表项都被不正确地删除。
问题:如何正确删除索引列表项?
答案 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应该有助于阻止你做你想做的事情!
唯一可靠解决方案是根据项目列表进行删除。如果需要(并通过索引删除),您可以在删除循环的每次迭代中从项目中查找项目索引,但是您无法存储索引列表并希望删除正常工作。