Seite 1 von 1

QMainWindow beim Konstruktor beenden

Verfasst: 28. September 2010 11:05
von DBGTMaster
Hallo,

zuerst mal Code:

main.cpp:

Code: Alles auswählen

#include <QtGui/QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow window();
    window.show();

    return a.exec();
}
MainWindow.h:

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void exitProgram();
};

#endif // MAINWINDOW_H
MainWindow.cpp:

Code: Alles auswählen

#include "MainWindow.h"

#include "ScalixLoginWindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {

    // Maximize the window by startup:
    this->showMaximized();

    // .....
    // .....

    // Show the login window:
    dialog *win = new DialogXY;
    int ret = win->exec();
    if (ret != QDialog::Accepted) {
        // Login dialog rejected, exit the application...
        exitProgram();
    }

}

/**
  * Slot, which exits the program.
  */
void MainWindow::exitProgram() {
    this->close();
}

MainWindow::~MainWindow()
{
//....
}
Beim starten des Hauptfensters erscheint ein LoginDialog. Klickt man hier auf "Abbrechen (SIGNAL rejected())", so soll die Anwendung beendet werden.
Klickt man auf OK (accepted) soll der Loginprozess statt finden und das Programm starten.

Das Problem ist beim "Abbrechen". Klicke auf auf diesen Button, wird die Hauptanwendung wie gewollt geschlossen, aber diese öffnet sich beim ausführen von "a.exec()" in der main() sofort wieder neu, dieses mal aber ohne Dialogabfrage...

Warum tut er das??

// Edit:
Oder sollte ich den Loginvorgang in eine eigene Methode des Hauptfensters verlegen, welche aufgerufen wird, wenn a.exec() aufgerufen wird? (welches Signal gibt es hierfür)

Danke!

Verfasst: 28. September 2010 11:21
von Nash
ja solltests du.

Das Problem ist ganz einfach:

Code: Alles auswählen

MainWindow window(); 
hier wird dein DialogXY im ctor schon angezeigt

und danach dein window nochmal egal welche eingabe dein DialogXY hatte:

Code: Alles auswählen

window.show(); 
tipp:
zieh den DialogXY aus dem ctor raus und platziere ihn in main, wenn der user auf okay klickt wird ein MainWindow erzeugt, ansonsten nicht.

Verfasst: 28. September 2010 11:32
von DBGTMaster
Ich denke, an

Code: Alles auswählen

window.show();
liegt es nicht, setze ich einen Breakpoint auf diese Methode, so wird das Fenster nicht angezeigt, erst beim ausführen von a.exec() wird es wieder angezeigt...

Würde gerne den Login in "MainWindow" packen, habe aber nun mal den Loginvorgang in MainWindow->doLogin() (ist ein Slot) gepackt.
Kann ich mit qApplication irgendwie ein Ereignis einrichten, dass der Slot doLogin ausgeführt wird, sobald ich a.exec() ausgeführt wird??

danke![/quote]

Verfasst: 28. September 2010 12:23
von upsala
1. Hatten wir dieses Thema erst vor kurzem
2. Im Konstruktor einen Timer starten, der dann einen SLOT aufruft, der die Login-Daten abfragt und ggf. das MainWindow wieder schließt.

Verfasst: 28. September 2010 13:01
von DBGTMaster
upsala hat geschrieben:1. Hatten wir dieses Thema erst vor kurzem
2. Im Konstruktor einen Timer starten, der dann einen SLOT aufruft, der die Login-Daten abfragt und ggf. das MainWindow wieder schließt.
Dürft ich einen Link haben?

// Edit:
Ist das so ok?

Code: Alles auswählen

// Start timer, whoch starts the initialization
    QTimer *timer = new QTimer(this);
    timer->setSingleShot(true);     // fire only onces
    timer->start(500);
    QObject::connect(timer, SIGNAL(timeout()), this, SLOT(init()));
Am Rande: Muss ich muss um die Zerstörung des Timers kümmern oder macht das Qt??

Verfasst: 28. September 2010 13:10
von franzf
Es gibt eine statische Funktion "QTimer::singleShot()", verwende besser die.

Verfasst: 28. September 2010 17:30
von upsala