PyQt4 - 从QListWidget中删除项目小部件

7
我有一个 QListWidget,需要删除一些项目。
从我所研究的内容来看,这通常是一件令人不愉快的事情。
我已经阅读了很多解决方案,但没有一个适用于我的特定情况。目前,我只需要处理实际的 Item Widgets;而不是它们的值或索引。这是因为我通过 .selectedItems() 获取需要删除的项目。
以下是代码:
ItemSelect = list(self.ListDialog.ContentList.selectedItems())

for x in range (0, len(ItemSelect)):
    print self.ListDialog.ContentList.removeItemWidget(ItemSelect[x])

这段代码实际上什么也没做。
它不会引发错误,但是选定的项目并没有被移除。
我看到的删除项目的方法要求使用项目的索引或名称,但我都没有。我只有实际的小部件。

我该如何将它们移除?

我是否漏掉了什么?

我正在使用:

Python 2.7.1
PyQt4 IDLE 1.8
Windows 7

3个回答

16

takeItem() 应该可以工作:

for SelectedItem in self.ListDialog.ContentList.selectedItems():
    self.ListDialog.ContentList.takeItem(self.ListDialog.ContentList.row(SelectedItem))

太棒了!我之前看到的常见解决方案是使用takeItem,但是我不确定如何将项目小部件转换为索引。谢谢! - Anti Earth
这不是很干净的代码。取出一个项目确实会将其从列表中移除,但该项目实际上并没有被“删除”。请参阅文档 - Spencer
1
但是这些文档没有说明如何删除它! - eri0o

8
从ListWidget中删除项目:
item = self.listWidget.takeItem(self.listWidget.currentRow())
item = None

2
如果返回的“item”没有分配给任何变量,垃圾收集器不应该回收内存吗?我认为“takeItem()”应该可以在不将其输出分配给任何变量并将该变量设置为“None”的情况下工作。 - nvd
currentRow() 仅适用于单选列表。否则,应使用 selectedItems() 并进行迭代。 - Ronan Paixão

2

很奇怪 QListWidget 没有直接删除项目的方法... 试试这个:

listWidget = self.ListDialog.ContentList
model = listWidget.model()
for selectedItem in listWidget.selectedItems():
    qIndex = listWidget.indexFromItem(selectedItem)
    print 'removing : %s' %model.data(qIndex).toString()
    model.removeRow(qIndex.row())

1
实际上有一个名为takeItem的方法(请参见其他答案)。 话虽如此,确实很奇怪它没有被称为removeItem - eric
@neuronet 我认为他们没有将其称为“removeItem”,是因为该项并未被销毁,而是通过此函数返回。例如,item = listWidget.takeItem(row) 将为您提供 QListWidgetItem 的对象,然后可以将其传递给另一个小部件或其他内容。 - Spencer
@neuronet 我之前听到过这样的建议,如果在一个设计良好的语言(比如Python和Qt)中存在不一致性,通常都有其合理的原因。 #知多点! - Spencer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接