Qt: delete und QListWidget



  • Um ein Item aus einem QListWidget zu löschen kann man ja mit currentItem oder item(int row) einen Pointer auf ein QListWidgetItem bekommen und dieses mit delete aus dem QListWidget löschen.

    Woher weiss nun QListWidget , dass das Item gelöscht wurde? Klar, der Speicher wird freigegeben, aber QListWidget 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.


Log in to reply