Удалить 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 не удаляет элемент, вы делаете это позже)

Другие вопросы по тегам