Forcer L'interface graphique Qt à se mettre à jour avant d'entrer dans une fonction distincte

Cela semble être automatique, mais apparemment ce n'est pas le cas. J'ai le code suivant:

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

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

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

Ce qui se passe, c'est que je ne vois jamais "Test1...", car l'interface graphique semble se bloquer jusqu'à ce que la fonction suivante soit terminée, et je ne vois que "Terminé.".

Comment puis-je m'assurer que l'interface graphique est mise à jour avant d'entrer dans cette fonction?
Grâce.

21
demandé sur Coding Mash 2012-09-13 20:05:26

3 réponses

Vous devriez pouvoir traiter la file d'attente d'événements avant d'entrer votre code si vous;

#include <QApplication>

Et, lorsque vous voulez actualiser votre interface graphique, appelez;

qApp->processEvents();

Notez que ce peut être une bonne idée de laisser votre processus de longue durée appeler cette fonction de temps en temps, pour rendre votre interface graphique plus réactive.

25
répondu Joachim Isaksson 2012-09-13 16:12:13

Si vous ne vous souciez pas que votre interface graphique soit réactive pendant ce temps, un appel à my_label->repaint() ferait l'affaire. Qt ne peut rien faire automatiquement pour vous sauf si vous cédez à la boucle d'événement.

Pour une réactivité maximale, vous pouvez envisager d'exécuter votre processus dans un thread séparé et utiliser des connexions signal / slot (qui sont sécurisées par défaut) pour signaler à votre thread GUI principal lorsque votre traitement est terminé.

14
répondu Chris 2012-09-13 16:23:30

Je voulais juste ajouter que pour moi, il a fallu un combo des deux réponses que j'ai vues ici. Donc, ce qui a fonctionné pour moi était:

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

J'espère que cela aide quelqu'un.

3
répondu Chuck Claunch 2014-11-13 19:09:43