4

要从 a 中删除给定QListWidgetItem* item的,QListWidget* lst我可以使用以下代码(取自此答案):

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

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

delete item; // method 2

QListWidget文档表明使用takeItem但没有提及有关删除该项目的任何内容(QListWidgetItem也没有任何信息)。

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

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

4

2 回答 2

4

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

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

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

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

于 2017-06-27T14:57:34.197 回答
2

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

文档说:

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

takeItem直接调用析构函数之间的最终区别在于调用takeAt而不是,removeAt并且在第一种情况下,能够返回已删除的项目,而在后者中,您只需完全丢弃该事物(take不会删除该项目,您可以以后再说)

于 2017-06-27T15:00:47.163 回答