2009-05-02 15 views
10

Estoy trabajando en un proyecto en C++ y QT, y quiero abrir una nueva ventana de QWidget, hacer que el usuario interactúe con ella, etc., y luego ejecutar de nuevo el método que abrió la ventana. Ejemplo (MiClase hereda QWidiget):Espere hasta que QWidget cierre

void doStuff(){ 

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

Siento que hay más probable es una manera muy fácil de hacer esto, pero por alguna razón no puede entenderlo. ¿Cómo puedo hacer esto?

Respuesta

22

Tiene MyClass hereda QDialog. Luego ábralo como un diálogo modal con exec().

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

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

+0

¡Eso era exactamente lo que estaba buscando, gracias! – Jarek

+0

Me alegro de poder ayudar. –

+0

El uso de un QDialog tiene efectos secundarios: se procesa de manera diferente de forma predeterminada y la tecla Escape lo cierra. Creo que la respuesta de @ 56ka evita esto. – Jonathan

0

¿Por qué no poner el código que no quiere que se ejecute hasta que la ventana se haya cerrado en una función separada y conectarlo como SLOT para el cierre de la ventana SIGNAL?

+0

Gracias, que suena como una buena idea. ¿Cómo haría esto? Nunca he codificado las señales/ranuras, solo las usé a través de QTDesigner. – Jarek

+0

Tendrá que modificar los archivos de código fuente. – dirkgently

10

Otra manera es utilizar un bucle que espera en el evento de cierre:

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