2010-03-01 16 views
8

Tengo una aplicación Qt que usa una clase QMainWindow -derivada para la interfaz de usuario principal. Al inicio, quiero hacer algunas comprobaciones de seguridad y, si fallan, mostrar un mensaje al usuario y cerrar la ventana principal. Actualmente realizo estas comprobaciones en el constructor QMainWindow, pero si llamo al método close, no ocurre nada y la aplicación continúa ejecutándose. Por ejemplo:¿Cerrar una QMainWindow en el inicio?

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) 
{ 
    setupUi(this); 
    ... 
    if (checkFails()) 
    { 
     QMessageBox::warning(this, tr("Error"), tr("You cannot run this app")); 
     // This has no effect 
     close(); 
    } 
} 

alternativa que podría hacer las comprobaciones en la función principal, pero entonces perdería la capacidad de mostrar un cuadro de mensaje específico del lenguaje (la tr macro sólo funciona en una clase derivada de QObject por el aspecto de cosas).

¿Alguna idea sobre cómo cerrar la ventana principal al iniciar o hacer que la macro tr funcione fuera de una clase derivada de QObject?

Respuesta

23

El bucle de eventos debe estar ejecutándose para poder cerrar con éxito la ventana principal. Dado que probablemente primero construya una ventana y luego inicie el ciclo de evento, la llamada close() no tendrá efecto. Pruebe la siguiente solución en su lugar:

QTimer::singleShot(0, this, SLOT(close())); 

El QTimer::singleShot() disparará tan pronto como se haya iniciado un ciclo de eventos, y posteriormente se llama al método close() en la ventana principal de la aplicación.

La solución anterior probablemente hará que la ventana principal de su aplicación sea visible durante un corto período de tiempo, causando parpadeos no deseados.

Una solución de limpieza debe realizar las comprobaciones de seguridad antes de construir la ventana principal. Como tr() también está disponible como método estático en QObject, esto se puede hacer desde la función principal.

2

tr es un public static member de QObject. Debería poder llamar al QObject::tr("Error") en su función principal.

0

¿Ha intentado ocultar primero() la ventana (esto debería ocurrir de todos modos cuando se llama a close()) para ver si esto permite entonces que close() destruya la ventana.

Si esto no funciona, siempre puede intentar destruir la ventana (verdadero, verdadero) junto con las subventanas.

2

La mayoría de las aplicaciones se inician en tres pasos: 1) construir la ventana; 2) muestra la ventana; 3) inicia el ciclo de eventos. Usted puede hacer los pasos 2 y 3 condicional en el éxito de la etapa 1 mediante la adición de una bandera, cuyo valor es fijado por el constructor de la ventana, a la clase de ventana: Clase

ventana: Código

class myMainWindowClass : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    myMainWindowClass() 
    : isFinished_(false) { if (error) isFinished_ = true; } // constructor 

    bool isFinished() const { return isFinished_; } 
private: 
    bool isFinished_; 
} 

Aplicación:

int main() 
{ 
    myMainWindowClass main_window(); // Step 1 

    // Finish early if isFinished flag is set 
    if (main_window.isFinished()) 
     return 0; 

    main_window.show(); // Step 2 
    return a.exec(); // Step 3 
} 

Esto también debería evitar cualquier parpadeo, ya que la aplicación finalizará antes de que se muestre la ventana() n.