MainWindow Objekt Werte übergeben (anlegen) & Verzögeru

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

MainWindow Objekt Werte übergeben (anlegen) & Verzögeru

Beitrag von Mineralwater »

Hallo Leute ich bin auf ein zweites Problem gestoßen und bin mir allerdings verdammt sicher das ihr mir da auch wieder weiterhelfen könnt.

In diesem Thema hatte ich ja gefragt wie ich es schaffe ein LoginFenster anzuzeigen und davon dann in Abhängigkeit das MainWindow anzeigen zu lassen.
http://qtforum.de/forum/viewtopic.php?t=9115

Das ganze hat bisher echt super geklappt. Der Aufbau der "main.cpp" sieht dabei so aus:

Code: Alles auswählen

int main(int argc, char *argv[])
{
    QApplication App(argc, argv);
    App.setStyle(new QWindowsVistaStyle);

    // ####   LoginDialog wird erstellt   #####
    LoginDialog *w_login = new LoginDialog();

    if(w_login->exec()) // Bool-Wert durch accept(); oder reject();
    {
        MainWindow *w = new MainWindow();
        return App.exec(); // Eventloop 
    }
    return 0;
}
#1 Frage:
Nun hab ich vom LoginDialog natürlich ein Passwort und einen Benuzternamen welcher vorher von einer Datenbank geprüft wurde und alle Daten sind ok. Von dem ganzen soll natürlich das MainWindow auch etwas haben, wie könnte man das also lösen?
Die Frage scheint mehr mit C++ selbst in Verbindung zu stehen aber mag einmal mehrere Lösungsmöglichkeiten hören.

Ich könnte bspw. Konstruktor MainWindow(); umbauen als MainWindow(Benutzername,Passwort); wenn ich mich nicht gänzlich irre.
Gibt es vll noch andere Möglichkeiten?


#2 Frage:
Hat wer von euch Erfahrungen gemacht im Bezug auf Verzögerungen? Ich hab im Logindialog eine progressbar welche durchlaufen soll bspw. int-Wert 50. Naja das ganze hab ich nun mit einer 20ms Pause in Kombi mit einer For-Schleife gelöst.

Code: Alles auswählen

...
class SleeperThread : public QThread
{
    public:
    static void msleep(unsigned long msecs)
    {
        QThread::msleep(msecs);
    }
};...
Und dann wie im Programm davon gebrauch gemacht wird:

Code: Alles auswählen

    for(int i=0;i<=50;i+=5)
    {
       SleeperThread::msleep(20);
       this->progressBar->setValue(i);
    }
Diese Lösung finde ich allerdings etwas... ja unschön und war so ziemlich die einzige brauchbare Funktion welche unter Google zu finden war.


Grüße
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

#1) DU kannst deine Konstruktoren gestalten wie due willst! Also auch zwei Strings mit Name und Passwort übergeben.
Du kannst aber auch eine eigene Funktion schreiben - logIn(name, passwort) - die den Login ausführt, und die du nach der Konstruktion deines MainWin aufrufst.
Desweiteren wird dein LoginDialog-Objekt nie zerstört... (Speicherleck). Brauchst hier auch gar nicht mit new anfangen, denn in main() wird alles automatisch am Ende von main() wieder zerstört, da ist dann das Programm fertig :)

#2) Das ist wirklich alles andere als schön, vor allem auch weil d meinst, der Login dauert 50*20 =1000 msecs, das ist wohl in 99.999999 der Fälle falsch ;)
Entweder der Login sendet immer wieder einen neuen State zurück, mit dem du dann deinen ProgressBar weiterschiebst, oder (am einfachsten)
progressBar->setRange(0,0);
und damit dieses "Flimmern" (k.A. grad wie das heißt :D) erzeugen.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

franzf hat geschrieben:Desweiteren wird dein LoginDialog-Objekt nie zerstört... (Speicherleck).
Das wäre es nur, wenn er zur Laufzeit mehrmals main() durchläuft, was wir hier mal nicht annehmen ;)
Mineralwater
Beiträge: 29
Registriert: 6. Mai 2009 16:44
Kontaktdaten:

Beitrag von Mineralwater »

Wie soll ich sagen? Hat beides super funktioniert!
Hab mich entschlossen doch einfach den Konstruktor abzuändern.

Das mit der Progressbar und dem setRange sieht klasse aus, danke für den Tipp!

Gruß
Antworten