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()));
Slot:
Code: Alles auswählen
void MainWindow::setMainWidget() {
mw = new MainWidget( this );
setCentralWidget( mw );
resize( 350, 200 );
statusBar()->clearMessage();
delete pwWidget;
return;
}