2012-04-09 5 views
6

¿Por qué este programa se ejecuta normalmente y muestra la ventana principal? Esperaría que salga ya que se llama al quit() en el constructor.¿Por qué la llamada quit() before exec() no sale de la aplicación?

Main.cpp:

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

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 
    MainWindow mainWindow; 
    mainWindow.show(); 
    return app.exec(); 
} 

mainwindow.cpp:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    qApp->quit(); 
} 

void MainWindow::closeEvent(QCloseEvent *) 
{ 
    qDebug("Hello world!"); 
} 

Respuesta

7

Calling QCoreApplication::quit() es lo mismo que llamar QCoreApplication::exit(0).

Si nos fijamos en la docs de la última función:

Después de esta función ha sido llamada, la aplicación deja el bucle principal evento y retornos de la llamada a exec(). La función exec() devuelve returnCode. Si el bucle de evento no se está ejecutando, esta función no hace nada.

En ti ejemplo, el bucle de eventos no se ha comenzado aún cuando MainWindow s constructor se llama, por lo tanto, la llamada a quit() no hace nada.

+0

buena gracias por la ayuda. – user1318674

6

Dado que QCoreApplication::quit() es no operativa hasta que se haya iniciado el ciclo de eventos, debe posponer la llamada hasta que se inicie. Por lo tanto, ponga en cola una llamada a método diferido al quit().

Las siguientes líneas son functionally identical, cualquiera de los dos trabajarán:

QTimer::singleShot(0, qApp, &QCoreApplication::quit); 
//or 
QTimer::singleShot(0, qApp, SLOT(quit())); 
// or - see https://stackoverflow.com/a/21653558/1329652 
postToThread([]{ QCoreApplication::quit(); }); 
// or 
QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection); 
Cuestiones relacionadas