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

Posted

技术标签:

【中文标题】PyQt4 - 从 QListWidget 中删除项目小部件【英文标题】:PyQt4 - Remove Item Widget from QListWidget 【发布时间】:2011-09-20 11:55:21 【问题描述】:

我有一个 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 空闲 1.8 视窗 7

【问题讨论】:

【参考方案1】:

takeItem() 应该可以工作:

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

【讨论】:

很有魅力!我看到常见的解决方案是 takeItem,但我不确定如何将项目小部件转换为索引。谢谢! 这不是很干净。取出一个项目确实会将其从列表中删除,但该项目实际上并未“删除”。见docs 但是这些文档没有说明如何删除它!【参考方案2】:

从 ListWidget 中删除一个项目:

item = self.listWidget.takeItem(self.listWidget.currentRow())
item = None

【讨论】:

如果返回的“项目”没有分配给任何变量,垃圾收集器不应该回收内存吗?我认为“takeItem()”应该可以工作,而无需将其输出分配给任何变量,然后将该变量设置为“None”。 currentRow() 仅适用于单选列表。否则,应该使用selectedItems() 并进行迭代。【参考方案3】:

这很奇怪,没有直接的方法可以从 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())

【讨论】:

实际上有一个方法叫做takeItem(见其他答案)。话虽如此,不叫removeItem确实很奇怪。 @neuronet 我假设他们没有将其称为“removeItem”,因为该项目没有被破坏,但实际上是通过这个函数返回的。即item = listWidget.takeItem(row) 将为您提供 QListWidgetItem 的对象,然后可以将其传递给另一个小部件或其他任何东西。 @neuronet 我不久前听到了这样的建议,如果精心设计的语言(如 python 和 Qt)存在不一致,通常是有充分理由的 ;) #themoreyouknow!

以上是关于PyQt4 - 从 QListWidget 中删除项目小部件的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4:使用 QPushButton 小部件从 QList 小部件中删除项目

PyQt4:如何获取 QlistWidget 的可见项目列表?

Python PyQt4 QFileDialog 图像并在 QListWidget 中加载

如何从 QListWidget 中删除 QListWidget 项

pyqt将一个小部件添加到QListWidget

在 Pyqt4 中用不同的 QMainWindow 刷新 QMainWindow