删除 QListWidgetItem:QListWidget::takeItem(item) vs 删除项目

Remove QListWidgetItem: QListWidget::takeItem(item) vs delete item

要从 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 也没有任何信息)。

To remove items from the list, use takeItem().

方法一(takeItem然后删除)和方法二(直接删除item)有区别吗?也许是我遗漏的内存泄漏,未发出的信号等?我的意思是,删除项目(当然,如果你有的话)似乎比搜索它更容易。

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

To remove an item (row) from the list entirely, either delete the item or use takeItem().

这意味着拿走项目然后删除它和直接删除它没有区别。

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

关于return是否删除的项目存在很大的语义差异:

docs say:

To remove an item (row) from the list entirely, either delete the item or use takeItem()

takeItem and calling the destructor directly will be in calling takeAt instead of removeAt 之间的最终区别,在第一种情况下,能够 return 删除的项目,而在后者中,您只需完全丢弃该项目(采取 不删除项目,你稍后再做)