Seite 1 von 1

Anwendung beenden via DialogButton " Abbrechen "

Verfasst: 17. Mai 2009 13:55
von Mineralwater
Hallo Leute!

Ich habe mich seit ein paar Wochen an die C++ Programmierung.
Mit Qt habe ich vorher noch gar nicht mit gearbeitet, dass sollte sich nun ändern.

Naja das Zeil was ich mir gesetzt habe ist bestimmt sehr leicht für den einen oder anderen, konnte auch schon bissle was zusammenbasteln.
Das Problem ist allerdings das ich es nicht schaffe über den Befehl qApp->quit(); bspw die Anwendung zu killen sobald im Dialog auf Abbrechen gedrückt wurde.
Ziel des ganzen ist eigentlich später das "MainWindow" erst dann angezeigt wird wenn der LoginDialog ausgewertet wurde und die Authentifizierung erfolgreich war. Anderenfalls soll das komplette Programm beendet werden.

Ich hab einfach mal das Projekt komplett angehängt, hoffe ich habs verständlich geschrieben, ansonsten fragt doch bitte einfach nochmal nach - werde schnellstmöglich zurück schreiben.

Vielen Dank schonmal im Vorraus!

Verfasst: 17. Mai 2009 16:26
von HappyEnding
Eine Moeglichkeit waere, dir von deinem Dialog bei "Abbrechen" ein "false" returnen zu lassen und das von deinem MainWindow als Abbruchbedingung interpretieren zu lassen und daraufhin zu quitten.

Verfasst: 17. Mai 2009 16:37
von Mineralwater
Du meinst beispielsweise durch ein reject(); ?

Das ganze hab ich bereits versucht nur wenn ich bspw. in der Funktion

Code: Alles auswählen

MainWindow::login(){
...
if(loginDialog->exec()){
 // ... alles okay, kein Abbruch nötig
}
else{
//... Abbruch nötig
qApp->quit(); // Anwendung soll gekillt werden.
}
}
Warscheinlich hab ich einfach einen Gedankenfehler oder etwas falsch vestanden, allerdings funktionierte das ganze leider nicht so bei mir.

Danke schonmal :)

Verfasst: 17. Mai 2009 18:49
von upsala

Code: Alles auswählen

mainwindow.cpp:2:25: error: LoginDialog.h: Datei oder Verzeichnis nicht gefunden
mainwindow.cpp: In member function ‘void MainWindow::login()’:
mainwindow.cpp:17: error: ‘LoginDialog’ was not declared in this scope
mainwindow.cpp:17: error: ‘loginDialog’ was not declared in this scope
mainwindow.cpp:17: error: expected type-specifier before ‘LoginDialog’
mainwindow.cpp:17: error: expected `;' before ‘LoginDialog’
mainwindow.cpp:24: error: ‘qApp’ was not declared in this scope
Ansonsten dein qApp->quit() wird aufgerufen, bevor deine Event-Loop aufgerufen wird. Das wird natürlich nichts. Starte den Login am besten über einen Single-Shot-Timer.

Verfasst: 17. Mai 2009 19:03
von Mineralwater
@Upsala:

Ehm ja okay das bläut natürlich ein bezüglich der Eventloop.
Das mit dem "Single-Shot-Timer" sagt mir nun so als blutiger Anfänger nicht ganz so viel.

Mal schaun ob ich was in der Doku dazu finde. Vielleicht gibts ja noch mehrere verschiedene Möglichkeiten?

Wäre natürlich für jeden Tipp dankbar.
Dir Upsala auch schonmal ein dickes Danke.

= )


// Nachtrag:
unter
http://doc.trolltech.com/4.5/qtimer.htm ... eShot-prop würde ich fündig, allerdings stelle ich mir gerade die Frage was das bringen soll.
Denn selbst wenn ich den LoginDialog zeitlich gesteuert aufrufe ändert es doch nichts an der Tatsache das ich die Eventloop noch nicht erreicht habe oder versteh ich da etwas falsch? (Beziehe das gerade mal auf das Beispiel mit dem was dort mit main(){..} angegeben ist.

Gruß

Verfasst: 17. Mai 2009 19:34
von upsala
Der Timer kann erst ein Event auslösen, wenn die EventLoop läuft. Deswegen der Trick mit dem Timer. Denn, der timeOut kommt frühestens wenn die EventLoop auch gestartet wurde. Alternativ könnte man auch das Polish-Event nehmen, aber das kennen die wenigsten.

Verfasst: 18. Mai 2009 13:19
von Mineralwater
soweit verstanden okay, aber...

wenn ich in dem Konstruktor von MainWindow(); nun also eine Funktion login(); aufrufe welche allerdings ja erst nach dem ersten Lauf des Eventloops greift, bedeutet das ja zwangsweise mein Konstruktor von MainWindow(); einmal durchgelaufen ist und dann bereits ein false erhalten hat vom Login. Schließlich konnte er keine Eingabe ausfindig machen weil der Dialog für den Benutzer nie vorhanden war.

Verfasst: 18. Mai 2009 14:21
von MichaelS
Hallo,

ich realisiere Login-Dialoge nicht im Konstruktor des Hauptfensters, sondern in der main.cpp:

Code: Alles auswählen

 //show login dialog
    myLoginDialog *pLoginDialog=new myLoginDialog();
    
    int iLoginResult=pLoginDialog->exec();
    delete pLoginDialog;

    [...]

    if (!iLoginResult)
    {

        //Mainwindow erzeugen und anzeigen
        
        //start event loop
        result=app.exec();
    } else
    return ERR_LOGIN_FAILED;
    

Verfasst: 18. Mai 2009 15:03
von pfid
MichaelS hat geschrieben:Hallo,

ich realisiere Login-Dialoge nicht im Konstruktor des Hauptfensters, sondern in der main.cpp
Wollte ich auch gerade vorschlagen. Vielleicht nicht unbedingt so formatiert, aber prinzipiell ist das doch die einfachste Möglichkeit ;)

Verfasst: 19. Mai 2009 12:46
von Mineralwater
Vielen Dank euch allen!