Qt - Verwendung von QList in QListWidget führt zu Programmabsturz
-
Hallo,
ich sitze hier schon einige Zeit auf der Suche nach der Ursache für sporadische Abstürze eines kleinen Programmes. Ich habe mir ein QListWidget erstellt und eine dazu passende QList<QListWidgetItem *>. Nun füge ich alle Elemente per addItem() in das QListWidget ein, was keine Probleme macht.
Allerdings muss ich später im Programm die QList bearbeiten, soll heißen, ein Element entfernen. Dazu verwende ich für ebendieses Element in etwa folgende Befehle:QListWidget * liste = new QListWidget(); QList<QListWidgetItem *> * l = new QList<QListWidgetItem *>; int i; //beliebig viele Elemente anhängen und in das QListWidget einfügen //Element i auswählen l->at(i)->setHidden(true); l->removeAt(i);
Während das bei wenigen Elementen noch funktioniert, treten (ausschließlich unter Windows) beim Entfernen vieler Elemente auf einmal Abstürze auf, mit einer Fehlermeldung des Debuggers "index out of range".
Da ich für das Entfernen der Listenelemente eine eigene Funktion benutze, ist klar zu erkennen, dass das eigentliche Entfernen noch problemlos funktioniert. Erst bei der Rückkehr ins Hauptprogramm erfolgt der Absturz. Wenn ich der Funktion noch die Zeile "l->clear();" zufüge, findet kein Absturz statt.Meine Vermutung ist nun, dass ich das Listenelement zwar lösche, aber das QListWidget dies nicht bemerkt und (evt. beim Neuzeichnen?) noch darauf zugreifen möchte. Allerdings würde das weder erklären, warum das Problem nur bei größeren Mengen gelöschter Objekte entsteht, noch weshalb ich es nur unter Windows und nicht unter Linux beobachten kann.
Vor diesem Problem sitze ich jetzt schon eine ganze Weile ziemlich ratlos, es wäre nett, wenn mir jemand auf die Sprünge helfen könnte.
-
Warum führst du denn eine eigene Liste? Wenn du alle items brauchst, bekommst du die auch mit QListWidget::findItems().
Kann es sein, dass du in einem SLOT die Items entfernst? Es kann durchaus sein, dass der nächste angebundene SLOT auf ein im vorigen SLOT gelöschtes Element (während dem selben Durchlauf der EventLoop) zugreifen will.
-
l'abra d'or__ schrieb:
Warum führst du denn eine eigene Liste? Wenn du alle items brauchst, bekommst du die auch mit QListWidget::findItems().
Kann es sein, dass du in einem SLOT die Items entfernst? Es kann durchaus sein, dass der nächste angebundene SLOT auf ein im vorigen SLOT gelöschtes Element (während dem selben Durchlauf der EventLoop) zugreifen will.Letzteres klingt sehr interessant, das schaue ich mal an. Dann müsste es ja theoretisch reichen, wenn ich den entsprechenden connect()-Befehl nach ganz hinten schiebe, oder?
EDIT: Der Befehl steht schon am Ende, so lässt es sich also leider nicht beheben. Aber es stimmt auf jeden Fall, dass es sich um einen SLOT handelt.Die Liste führe ich, weil da noch etwas mehr dranhängt als nur der Itemname und ich nicht wüsste, wie ich das anders umsetzen sollte.