Qt: delete und QListWidget
-
Um ein Item aus einem
QListWidget
zu löschen kann man ja mitcurrentItem
oderitem(int row)
einen Pointer auf einQListWidgetItem
bekommen und dieses mitdelete
aus demQListWidget
löschen.Woher weiss nun
QListWidget
, dass das Item gelöscht wurde? Klar, der Speicher wird freigegeben, aberQListWidget
kann das doch nicht wissen!? Weiss jemand wie das intern implementiert sein könnte? Ich stehe da echt gerade auf dem Schlauch...
-
Indem du remove an dem list widget aufrufst??
http://qt-project.org/doc/qt-4.8/qlistwidget.html#removeItemWidget
-
Ja,
remove
geht, aber das meinte ich nicht.Es geht um Seite 65 im Foundations of Qt Development Buch (man findet das pdf davon mit Google). Da steht
The opposite of adding a new item is shown in Listing 2-5. Deleting a list widget item is just a matter of calling delete on it. The currently selected item is returned from thecurrentItem method, so just delete whatever that method returns. If no item is selected, the return value is 0 (zero, a null pointer), but that is not a problem when used in a call to delete—it is simply ignored
und dazu Listing 2-5.
void ListDialog::deleteItem() { delete ui.list->currentItem(); // list ist ein QListWidgetItem, ui eine Desinger Form }
Woher weiss nun
QListWidget
, dass das aktuelle Element tatsächlich gelöscht wurde? Ich habs mal getestet und es hat funktioniert. Aber wie das intern abläuft ist mir schleierhaft.
-
Weil jedes QObject im Destruktor ein destroyed Signal auslöst. Es gibt sogar einen QPointer, der darauf horcht und ungültig wird, wenn das Objekt gelöscht wird. Die ListView wirds an der Stelle wahrscheinlich nicht verwenden, sondern sich direkt mit dem Signal verbinden (bzw., das Model), ist aber nützlich QPointer zu kennen.
-
Vielen Dank für die Erklärung. Ich werde mir den
QPointer
mal genauer anschauen.