2010-03-01 8 views
8

Ho un'applicazione Qt che utilizza una classe precedente QMainWindow per l'interfaccia utente principale. All'avvio, desidero eseguire alcuni controlli di sicurezza e, in caso di errore, visualizzare un messaggio all'utente e chiudere la finestra principale. Attualmente eseguo questi controlli nel costruttore QMainWindow, ma se chiamo il metodo close, non accade nulla e l'applicazione continua a funzionare. Per esempio:Chiusura di QMainWindow all'avvio?

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(); 
    } 
} 

In alternativa avrei potuto fare i controlli nella funzione principale, ma poi ho perso la possibilità di visualizzare una finestra di messaggio specifico della lingua (la tr macro funziona solo in una classe -derived QObject tramite gli sguardi di cose.)

Qualche idea su come chiudere la finestra principale all'avvio o rendere la macro tr al di fuori di una classe derivata QObject?

risposta

23

Il ciclo di eventi deve essere in esecuzione prima di poter chiudere correttamente la finestra principale. Dal momento che probabilmente si costruisce prima una finestra e poi si avvia il ciclo degli eventi, la chiamata close() non ha alcun effetto. Provare la seguente soluzione invece:

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

Il QTimer::singleShot() sparerà non appena è stato avviato un ciclo di eventi, e, successivamente, chiama il metodo close() sulla finestra principale dell'applicazione.

La soluzione riportata sopra farà sì che la finestra principale dell'applicazione sia visibile per un breve periodo di tempo, causando sfarfallio indesiderato.

Una soluzione più pulita dovrebbe eseguire i controlli di sicurezza prima di costruire la finestra principale. Poiché tr() è disponibile anche come metodo statico su QObject, ciò può essere eseguito dalla funzione principale.

2

tr è un public static member di QObject. Dovresti essere in grado di chiamare QObject::tr("Error") nella tua funzione principale.

0

Hai provato prima nascondi() la finestra (ciò dovrebbe accadere comunque quando viene chiamato close()) per vedere se questo consente a close() di distruggere la finestra.

Se questo non funziona, si può sempre provare a distruggere (vero, vero) la finestra insieme a qualsiasi sotto-finestra.

2

La maggior parte delle applicazioni si avviano in tre fasi: 1) costruire la finestra; 2) mostra la finestra; 3) avviare il ciclo degli eventi. È possibile effettuare i punti 2 e 3 subordinata al successo della fase 1 con l'aggiunta di un flag, il cui valore è impostato dal costruttore finestra, per la classe di finestra: classe

Window: codice

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

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

Applicazione:

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 
} 

Questo dovrebbe anche evitare qualsiasi sfarfallio in quanto l'applicazione finirà prima che la finestra sia mostrata() n.

Problemi correlati