Удалить QListWidgetItem: QListWidget::takeItem(item) против удаления элемента
Чтобы удалить данный QListWidgetItem* item
из QListWidget* lst
Я могу использовать следующий код ( взят из этого ответа):
delete lst->takeItem(lst->row(item)); // method 1
С другой стороны, если я просто уничтожу элемент, он также будет удален из списка (по крайней мере, он исчезнет из QListWidget
).
delete item; // method 2
QListWidget
документация указывает на использование takeItem
но ничего не упоминает об удалении элемента (QListWidgetItem
не имеет никакой информации)
Чтобы удалить элементы из списка, используйте takeItem().
Есть ли разница между использованием метода 1 (takeItem
а затем удалить его) и метод 2 (непосредственно удалить элемент)? Может быть, утечка памяти у меня отсутствует, сигнал, который не излучается и т. Д.? Я имею в виду, что кажется проще просто удалить элемент (если он у вас есть, конечно), чем искать его.
2 ответа
Следующая строка из документации отвечает на ваш вопрос:
Чтобы полностью удалить элемент (строку) из списка, либо удалите элемент, либо используйте
takeItem()
,
Это означает, что нет никакой разницы между тем, что вы берете элемент, затем удаляете его или удаляете напрямую.
takeItem()
просто удаляет владение из предмета, так что у вас есть возможность что-то с ним сделать (возможно, использовать его в другом QListWidget
). Если вы просто хотите удалить элемент, вы можете просто удалить его, а деструктор позаботится об удалении владельца.
Существует существенная семантическая разница, связанная с возвратом или не удалением элемента:
Чтобы полностью удалить элемент (строку) из списка, либо удалите элемент, либо используйте takeItem()
Конечная разница между takeItem
и вызов деструктора напрямую будет в вызове takeAt
вместо removeAt
и, в первом случае, возможность вернуть удаленный элемент, в то время как в последнем случае вы просто полностью его отбрасываете (take не удаляет элемент, вы делаете это позже)