Seite 1 von 1

[gelöst] Löschen eines benutzerdefinierten QGraphicsItem

Verfasst: 8. Oktober 2008 15:43
von mathies
Hallo,

ich habe eine Itemklasse von QGraphicsItem abgeleitet und Funktionen wie paint() und boundingRect() meinen Vorstellungen angepasst. Funktioniert auch alles soweit.

Da das selektieren eines Items bei mir nicht richtig klappt, habe ich meiner Klasse eine public Methode spendiert, die das übernehmen soll und intern auch einen neuen Zustand verwaltet (nein, ich habe nicht versucht die setSelected() zu überschreiben).

Ich kann Items in meine Scene ohne Probleme einfügen aber sobald ich das Programm beende oder versuche das Item zu löschen gibt es ne Speicherschutzverletzung im Destruktor von QGraphicsItem bei:

Code: Alles auswählen

delete d_ptr;
Lasse ich den Konstruktoraufruf von QGraphicsItem beim Löschen weg funktioniert alles solang das Programm läuft, kommt aber dann beim Beenden der gleiche Fehler. Kann ich das irgendwie abfangen bzw. was muss ich berichtigen?

Ich habe in meiner Klasse auch noch eine protected Methode die ohne Probleme funktioniert?!

Vielen Dank für Hinweise.

Re: Löschen eines benutzerdefinierten QGraphicsItem

Verfasst: 8. Oktober 2008 19:50
von solarix
mathies hat geschrieben: Ich kann Items in meine Scene ohne Probleme einfügen aber sobald ich das Programm beende oder versuche das Item zu löschen gibt es ne Speicherschutzverletzung im Destruktor von QGraphicsItem bei:
Da zeigt ein Pointer ins Nirvana...
mathies hat geschrieben: Lasse ich den Konstruktoraufruf von QGraphicsItem beim Löschen weg
Verstehe ich nicht... :? bitte code..
mathies hat geschrieben: funktioniert alles solang das Programm läuft, kommt aber dann beim Beenden der gleiche Fehler. Kann ich das irgendwie abfangen bzw. was muss ich berichtigen?

Bei Pointergebastel verhält sich das Programm undefiniert und kann sich daher je nach Code komplett anderst verhalten (resp. Crash zu einem ganz anderen Zeitpunkt). Du hast folgende Möglichkeiten
* Code nochmals durchsehen, "Besitzer" und Lebensdauer aller verwalteten Objekte prüfen
* Debugger anwerfen und Pointer prüfen
* Programm immer weiter reduzieren, bis der Fehler offensichtlich ist
* Programm reduzieren und hier posten.

Verfasst: 8. Oktober 2008 21:13
von mathies
Hallo und danke für die Antwort. Ich versuche es mal zu reduzieren.

Generell verstehe ich aber den Fehler nicht. Sobald ich eine als public definierte Methode zu meiner ItemKlasse hinzufüge kackt es am Ende des Programms ab, sonst klappt alles. Während des Programmlaufs kann ich alles machen - hinzufügen, löschen etc.

Verfasst: 8. Oktober 2008 21:42
von solarix
ich würde davon ausgehen, dass der Fehler woanderst liegt. Denn wie gesagt.... bei Pointergeschichten reicht manchmal irgendeine Änderung am Code, dass das Programm abkackt oder (natürlich immer noch fehlerhaft) weiterläuft. Das ist rein zufällig (andere Binary = anderer Aufbau im Speicher)

Verfasst: 9. Oktober 2008 10:33
von mathies
Danke nochmal für den Tip, der Pointer hat mich auf die richtige Spur gebracht. Lag aber komischerweise nicht an meinem Item...hmmm :)