Ich habe QAbstractItemModel abgeleitet, um eingehende Ereignisse in einem TreeView darzustellen (siehe auch in meinem anderen Thread). Dabei muss ich aber gelegentlich Items ersetzen. Zunächst dachte ich mir, ich tu's einfach und löse anschließend das dataChanged()-Signal aus. Ich fand es schon recht kompliziert, den passenden QModelIndex zu ermitteln, aber es ging schon. Dabei kam es jedoch zu relativ unerklärlichen Abstürzen: Kurz danach wurde die parent()-Methode mit einem QModelIndex aufgerufen, der als internalPointer einen Zeiger auf das soeben gelöschte Objekt enthält. Nanu?
Also dachte ich mir, gehen wir etwas langsamer daran. Also lösche ich in aller Ruhe das alte Objekt (mit vorigem beginRemoveRows und anschließendem endRemoveRows). Das Problem bleibt dabei bestehen, die Exception wird bereits beim Aufruf von endRemoveRows geworfen. Wiederum wird ein QModelIndex mit internalPointer auf das gelöschte Objekt an parent() übergeben. Ich übergebe jedoch die korrekten Indizes an beginRemoveRows (QModelIndex des Parent, Index des zu löschenden Items als first und als last).
Mir ist nicht im Mindesten klar, woran das liegt. Das Model ist im Wesentlichen "normal" implementiert, entspricht also weitestgehend den Beispielen. Wie zum Henker kommt Qt dazu, parent() für das alte Item aufzurufen? Natürlich geht das schief. Und ich muss doch schließlich das Item vor endRemoveRows löschen, oder nicht? Ich könnte es zwar hinterher machen, aber das ist doch absurd. Also wo liegt mein Denkfehler? Zu diesem Zeitpunkt will ich doch bloß ein Item entfernen. Das kann doch nicht so kompliziert sein.
Edit: Gelegentlich tritt der Absturz auch während des paintEvents auf. Auch hier verweist der ModelIndex auf ein ungültiges Objekt.
QAbstractItemModel: Items ersetzen?
-
OregonGhost
- Beiträge: 19
- Registriert: 30. Juli 2007 10:37
- Wohnort: Lübeck
- Kontaktdaten:
-
OregonGhost
- Beiträge: 19
- Registriert: 30. Juli 2007 10:37
- Wohnort: Lübeck
- Kontaktdaten: