删除 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的主要内容,如果未能解决你的问题,请参考以下文章