2009-05-02 11 views
10

Sto lavorando su un progetto in C++ e QT, e voglio aprire una nuova finestra QWidget, avere l'utente interagisce con esso, ecc, poi l'esecuzione ritorno al metodo che ha aperto la finestra. Esempio (MyClass eredita QWidiget):Attendere QWidget chiude

void doStuff(){ 

    MyClass newWindow = new Myclass(); 
    /* 
     I don't want the code down here to 
     execute until newWindow has been closed 
     */ 
} 

Mi sento come se c'è più probabile un modo molto semplice per fare questo, ma per qualche motivo non riesco a capirlo. Come posso fare questo?

risposta

22

Avere MyClass ereditare QDialog. Quindi aprilo come una finestra di dialogo modale con exec().

void MainWindow::createMyDialog() 
{ 
    MyClass dialog(this); 
    dialog.exec(); 
} 

Partenza http://qt-project.org/doc/qt-4.8/qdialog.html

+0

Era esattamente quello che stavo cercando, grazie! – Jarek

+0

Contento di aver potuto aiutare. –

+0

L'uso di un QDialog ha effetti collaterali - è reso diversamente per impostazione predefinita, e il tasto Esc lo chiude. Credo che la risposta di @ 56ka eviti questo. – Jonathan

0

Perché non inserire il codice che non si desidera eseguire finché la finestra non si chiude in una funzione separata e connetterlo come SLOT per la chiusura della finestra SIGNAL?

+0

Grazie, che suona come una buona idea. Come lo farei? Non ho mai registrato hard disk/slot, li ho usati solo tramite QTDesigner. – Jarek

+0

Dovrai modificare i file del codice sorgente. – dirkgently

10

Un altro modo è quello di utilizzare un ciclo che attende l'evento di chiusura:

#include <QEventLoop> 

void doStuff() 
{ 
    // Creating an instance of myClass 
    MyClass myInstance; 
    // (optional) myInstance.setAttribute(Qt::WA_DeleteOnClose); 
    myInstance.show(); 

    // This loop will wait for the window is destroyed 
    QEventLoop loop; 
    connect(this, SIGNAL(destroyed()), & loop, SLOT(quit())); 
    loop.exec(); 
}