QMainWindow beim Konstruktor beenden

Alles rund um die Programmierung mit Qt
Antworten
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

QMainWindow beim Konstruktor beenden

Beitrag 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!
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag 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.
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

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

Beitrag 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.
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Beitrag 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??
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Es gibt eine statische Funktion "QTimer::singleShot()", verwende besser die.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Antworten