[gelöst] Löschen eines benutzerdefinierten QGraphicsItem

Alles rund um die Programmierung mit Qt
Antworten
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

[gelöst] Löschen eines benutzerdefinierten QGraphicsItem

Beitrag 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.
Zuletzt geändert von mathies am 9. Oktober 2008 10:33, insgesamt 1-mal geändert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: Löschen eines benutzerdefinierten QGraphicsItem

Beitrag 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.
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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)
mathies
Beiträge: 149
Registriert: 9. Februar 2007 17:50
Wohnort: Erfurt

Beitrag 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 :)
Antworten