[gelöst]SIGNAL(returnPressed) segmentation fault nach delete

Alles rund um die Programmierung mit Qt
Antworten
Urki
Beiträge: 10
Registriert: 25. Januar 2009 02:42

[gelöst]SIGNAL(returnPressed) segmentation fault nach delete

Beitrag von Urki »

Hi,

der Betreff des Themas ist vielleicht nicht gut gewählt, aber mir fällt leider nichts besseres ein. Ich benutze hierfür Qt 4.7.3:

Grobe Beschreibung:

Ich habe ein MainWindow. Beim Start des Programmes soll man sich erst anmelden. Dazu habe ich eine neue Klasse von QWidget abgeleitet und mit Buttons, LineEdits, Labeln und Layouts versehen. Dieses QWidget Objekt setze ich im MainWindow als CentralWidget.
Per clicked() Signal eines Buttons oder returnPressed() Signal vom LineEdit des Widgets wird, wenn die Anmeldedaten in Ordnung sind, im MainWindow ein Slot aufgerufen, der ein anderes Widget als CentralWidget setzt, resize aufruft und das QWidget zur Passwortabfrage löscht, da ich es während des gesamten Programmablaufes nicht wieder brauche.

Fehler:

Per Button clicked funktionert das auch ohne Probleme, wenn ich genau denselben Slot per LineEdit returnPressed aufrufe, schmiert das Programm in 9 von 10 Fällen mit einem Segmentation fault ab. Komischerweise nicht in 100% der Fälle. Ich habe es nun schon sehr oft versucht den Fehler auch per clicked herbei zu führen, allerdings habe ich das nicht geschafft. Ich dachte erst es hätte mit einem Timing zu tun, wie schnell ich die Eingaben mache, aber auch hier habe ich bislang kein Muster erkennen können.
Wenn ich das Widget nicht lösche läuft alles ohne Probleme, ich sehe allerdings nicht den Unterschied zwischen den Beiden Signalen. Ich habe auch shon versucht erst zu einem Slot der eigenen Klasse zu verbinden und dort ein neues Signal auszulösen, welches dann den Slot aus dem MainWindow aufruft. Bei dem editingFinished Signal passiert das gleiche.

Code:

Signals:

Code: Alles auswählen

connect(nameEdit, SIGNAL(returnPressed()), parent, SLOT(setMainWidget()));
connect(pwEdit, SIGNAL(returnPressed()), parent, SLOT(setMainWidget()));
connect(newUserButton, SIGNAL(clicked()), parent, SLOT(setMainWidget()));
Das ganze passiert auch, wenn nur ein LineEdit verbunden wird.

Slot:

Code: Alles auswählen

void MainWindow::setMainWidget() {
    mw = new MainWidget( this );
    setCentralWidget( mw );
    resize( 350, 200 );

    statusBar()->clearMessage();

    delete pwWidget;

    return;
}
Hat vielleicht jemand eine Idee warum dies passiert bzw einen Vorschlag wie ich es anders lösen könnte? Irgendetwas macht QLineEdit anders als QButton. Die Bestätigung per Enter möchte ich definitiv behalten. Danke im Vorraus.
Zuletzt geändert von Urki am 26. Juli 2011 00:58, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: SIGNAL(returnPressed()) segmentation fault nach delete

Beitrag von Christian81 »

Signals & Slots kann man als normale Aufrufe verstehen. D.h. pwEdit hat gerade sein Signal returnPressed() aufgerufen und dadurch werden alle Slots abgearbeitet. Danach geht es innerhalb von pwEdit an der Stele weiter. Wenn das Objekt aber zersört ist... nunja :)
--> QObject::deleteLater()
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Urki
Beiträge: 10
Registriert: 25. Januar 2009 02:42

Re: SIGNAL(returnPressed()) segmentation fault nach delete

Beitrag von Urki »

:roll: QObject Reference ..., da hätte ich auch selber drauf kommen können, dankeschön ;). Damit funktioniert es jedenfalls.

Das es mit den Signals und Slots zu tun hat, habe ich mir ja gedacht. So ganz verstehe ich allerdings trotzdem nicht wo der Unterschied zu dem Button liegt. Wenn er hinterher bei pwEdit bzw dem Button weitermacht ist vielleicht bei einem LineEdit tatsächlich noch etwas mehr zu machen als beim Button. Da reicht es wahrscheinlich einfach zu verstehen, dass noch etwas im Gange sein kann und man in so einem Fall lieber deleteLater benutzt. Ich schätze mal wenn es blöd läuft, kann es auf einem anderen System mit dem Button auch nicht mehr zu 100% funktionieren, wenn man nicht deleteLater nimmt.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: SIGNAL(returnPressed()) segmentation fault nach delete

Beitrag von solarix »

So ganz verstehe ich allerdings trotzdem nicht wo der Unterschied zu dem Button liegt
Das musst du auch gar nicht, weil das eine klasseninterne Geschichte ist. Das gilt ganz generell beim Programmieren: wenn man eine Klasse anwendet, so hat man den Code so zu schreiben, dass er unabhängig von der Implementierung der Klasse funktioniert. Dein Fall ist ja auch nichts Qt-spezifisches: man löscht einfach keine Objekte des aktuellen Stacks. Das was du tust ist im Grunde das gleiche wie

Code: Alles auswählen

 mMember = 42;
 delete this;
 mMember = 23; // scheisse.. jetzt haben wir den Speicher ja eben freigegeben..
:wink:
und man in so einem Fall lieber deleteLater benutzt
Umgekehrt: verwende immer deleteLater bei QObjekten ausser du weisst Bescheid und brauchst ein sofortiges "delete".

hth!
Urki
Beiträge: 10
Registriert: 25. Januar 2009 02:42

Re: SIGNAL(returnPressed()) segmentation fault nach delete

Beitrag von Urki »

solarix hat geschrieben:
Das was du tust ist im Grunde das gleiche wie

Code: Alles auswählen

 mMember = 42;
 delete this;
 mMember = 23; // scheisse.. jetzt haben wir den Speicher ja eben freigegeben..
:wink:
:oops:, naja schon, aber nicht ganz so offentsichtlich finde ich :mrgreen:. Aber darüber habe ich zugegeben nicht genug nachgedacht, eher über den vergleich der beiden Signale/Objekte.
Antworten