Anwendung beenden via DialogButton " Abbrechen "

Alles rund um die Programmierung mit Qt
Antworten
Mineralwater
Beiträge: 29
Registriert: 6. Mai 2009 16:44
Kontaktdaten:

Anwendung beenden via DialogButton " Abbrechen "

Beitrag 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!
Dateianhänge
Netzwerk.zip
(101.46 KiB) 158-mal heruntergeladen
HappyEnding
Beiträge: 26
Registriert: 5. März 2009 14:15

Beitrag 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.
Mineralwater
Beiträge: 29
Registriert: 6. Mai 2009 16:44
Kontaktdaten:

Beitrag 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 :)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
Mineralwater
Beiträge: 29
Registriert: 6. Mai 2009 16:44
Kontaktdaten:

Beitrag 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ß
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
Mineralwater
Beiträge: 29
Registriert: 6. Mai 2009 16:44
Kontaktdaten:

Beitrag 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.
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag 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;
    
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag 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 ;)
Mineralwater
Beiträge: 29
Registriert: 6. Mai 2009 16:44
Kontaktdaten:

Beitrag von Mineralwater »

Vielen Dank euch allen!
Antworten