【问题标题】:Remove QListWidgetItem: QListWidget::takeItem(item) vs delete item删除 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(直接删除项目)有什么区别吗?也许我错过了内存泄漏、未发出的信号等?我的意思是,删除该项目(当然,如果你有的话)似乎比搜索它更容易。

【问题讨论】:

    标签: c++ qt qlistwidget qlistwidgetitem


    【解决方案1】:

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

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

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

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

    【讨论】:

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

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

    docs say:

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

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

    【讨论】:

    • 谢谢!因为我已经有了takeItem 的项目,所以没有添加任何内容。当然,如果我只有行索引,情况会有所不同。
    猜你喜欢
    • 2014-06-05
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2011-08-29
    • 1970-01-01
    • 2013-05-01
    • 2018-08-03
    相关资源
    最近更新 更多