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