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

时间:2017-06-27 14:43:04

标签: c++ qt qlistwidget qlistwidgetitem

要从QListWidgetItem* item删除给定的QListWidget* lst,我可以使用以下代码(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(直接删除项目)之间有什么区别吗?也许我错过了内存泄漏,没有发出的信号等等?我的意思是,删除项目似乎更容易(当然,如果你有它),而不是搜索它。

2 个答案:

答案 0 :(得分:2)

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

  

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

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

takeItem()只是删除了该项目的所有权,因此您有机会对其执行任何操作(可能在另一个QListWidget中使用它)。如果您只想删除该项,则可以删除它,析构函数将负责删除所有权。

答案 1 :(得分:2)

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

docs say:

  

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

takeItemcalling the destructor directly之间的最终差异在于调用takeAt而不是removeAt,并且在第一种情况下,能够在进入时返回已移除的项目后者你只是完全丢弃了这个东西( take 不删除该项目,你以后再做)