删除 QListWidgetItem:QListWidget::takeItem(item) vs delete item

Posted

技术标签:

【中文标题】删除 QListWidgetItem:QListWidget::takeItem(item) vs delete item【英文标题】:Remove QListWidgetItem: QListWidget::takeItem(item) vs delete item 【发布时间】:2017-06-27 14:43:03 【问题描述】:

要从 QListWidget* lst 中删除给定的 QListWidgetItem* item,我可以使用以下代码 (taken from this answer):

delete lst->takeItem(lst->row(item)); // method 1

另一方面,如果我只是销毁该项目,它也会从列表中删除(至少它从QListWidget消失)。

delete item; // method 2

QListWidget documentation 表示使用takeItem,但没有提及删除项目(QListWidgetItem 也没有任何信息)。

要从列表中删除项目,请使用 takeItem()。

使用方法1(takeItem然后删除)和方法2(直接删除项目)有什么区别吗?也许我错过了内存泄漏、未发出的信号等?我的意思是,删除该项目(当然,如果你有的话)似乎比搜索它更容易。

【问题讨论】:

【参考方案1】:

docs 中的以下行回答了您的问题:

要从列表中完全删除项目(行),要么删除项目使用takeItem()

这意味着取该项目然后删除它,或者直接删除它没有区别。

takeItem() 只是从项目中删除所有权,这样你就有机会对它做任何事情(也许在另一个 QListWidget 中使用它)。如果您只想删除该项目,您可以删除它,析构函数将负责删除所有权。

【讨论】:

由于removedItemWidget 不适合我,我完全忽略了它。感谢您的快速回答@Mike。 不客气 :) 。 removeItemWidget() 并不是要从 QListWidget 中删除项目,它是用来删除之前使用 setItemWidget() 在项目上设置的小部件。 是的,当我阅读文档时我得到了它,但是当我看到名字时最初的想法是它删除了QListWidgetItem ;)【参考方案2】:

返回或不返回删除的项目有很大的语义差异:

docs say:

要从列表中完全删除一个项目(行),请删除该项目或使用 takeItem()

takeItem 和 calling the destructor directly 之间的最终区别在于调用 takeAt 而不是 removeAt,并且在第一种情况下,能够返回已删除的项目,而在后一种情况下,您只需将其完全丢弃(take 不会删除项目,你稍后再做)

【讨论】:

谢谢!因为我已经有了takeItem 的项目,所以没有添加任何内容。当然,如果我只有行索引,情况会有所不同。

以上是关于删除 QListWidgetItem:QListWidget::takeItem(item) vs delete item的主要内容,如果未能解决你的问题,请参考以下文章

Qt学习之QListWidget删除Item

使用 QlistW 减少 RAM 使用 [关闭]

Qt学习之QListWidget删除Item

QListWidgetItem 中不可见的图标

在 setupUI 中连接 QListWidgetItem [重复]

使用 qtbot.mouseClick 选择 QListWidgetItem