Удалить 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). Если вы просто хотите удалить элемент, вы можете просто удалить его, а деструктор позаботится об удалении владельца.

1

Другие решения

Существует существенная семантическая разница, связанная с возвращаться или нет удаленный элемент:

документы говорят:

Чтобы полностью удалить элемент (строку) из списка, либо удалите элемент, либо используйте takeItem ()

Конечная разница между takeItem а также вызов деструктора напрямую будет в вызове takeAt вместо removeAt и, в первом случае, иметь возможность вернуть удаленный предмет, тогда как во втором случае вы просто отбрасываете предмет полностью (принимать не удаляет элемент, вы делаете это позже)

2

По вопросам рекламы [email protected]