2012-09-13 17 views
20

Parece que debería ser automático, pero aparentemente no lo es. Tengo el siguiente código: "Terminado"Forzar la actualización de la GUI de Qt antes de ingresar a una función separada

ui.my_label->setText("Test 1..."); 
    ui.my_label->adjustSize(); 

    processThatTakesAbout30SecondsToFinish(files[0].toStdString()); 

    ui.my_label->setText("Finished."); 
    ui.my_label->adjustSize(); 

Lo que ocurre es que nuncaveo "Test1...", como la interfaz gráfica de usuario parece colgar hasta que la siguiente función completa, y yo eventaully sólo ven.

¿Cómo puedo asegurarme de que la GUI se esté actualizando antes de ingresar a esa función?
Gracias.

+2

¿Has probado algo como 'repaint()' o 'update()'? – Derek

Respuesta

24

Debería poder procesar la cola de eventos antes de ingresar su código;

#include <QApplication> 

y, cuando desee actualizar su GUI, llame;

qApp->processEvents(); 

en cuenta que puede ser una buena idea dejar que su llamada larga proceso en ejecución que funcionan de vez en cuando, para que su interfaz gráfica de usuario se sienta más sensible.

+2

Esto definitivamente funcionaría, aunque generalmente trato de desaconsejar las llamadas a 'processEvents', ya que puede causar muchos problemas inesperados si no se reentrata el código. – Chris

14

Si no le importa que su GUI responda durante este tiempo, una llamada al my_label->repaint() haría el truco. Qt no puede hacer nada automáticamente por ti a menos que cedas al ciclo de evento.

Para una máxima capacidad de respuesta, puede considerar ejecutar su proceso en un subproceso separado y usar conexiones de señal/ranura (que son seguras para subprocesos por defecto) para señalizar su subproceso GUI principal cuando finaliza su procesamiento.

3

Solo quería agregar que para mí fue necesario un combo de las dos respuestas que vi aquí. Entonces lo que funcionó para mí fue:

ui.my_label->setText("Test 1..."); 
ui.my_label->adjustSize(); 

//! Both of these lines needed 
ui.my_label->repaint(); 
qApp->processEvents(); 

processThatTakesAbout30SecondsToFinish(files[0].toStdString()); 

ui.my_label->setText("Finished."); 
ui.my_label->adjustSize(); 

Espero que esto ayude a alguien.

+0

'self.repaint()' después de 'self.progress.setVisible (False)' funciona en mi caso – Winand

+0

Huh, lo mismo para mí. Necesitaba que ambos trabajaran. Podrías pensar que 'processEvents' repintaría automáticamente todo. –

Cuestiones relacionadas