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.
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.
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é.
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.