2011-12-13 3 views
1

J'ai cherché une solution pour mon problème et rien ... J'utilise un QMovie avec une animation GIF dans un QLabel pour un statut de chargement, d'accord? C'est simple et j'ai appris dans ce lien: GIF animation in Qt, cela fonctionne parfaitement quand j'ouvre un menu, par exemple, que possède une étiquette et j'ai mis le QMovie dans un QLabel de ce menu. Mon problème est maintenant, j'ai fait une interface utilisateur spécifique pour le chargement de l'état, quand je sais que certaines interface utilisateur sera lente à ouvrir, je montrerais mon état de chargement UI et quand l'interface se termine pour ouvrir je fermerais mon état de chargement UI. Dans ce chargement de l'interface utilisateur j'ai mis un QMovie (animation GIF) et un QLabel simple écrit "Chargement ...", très simple, non? Buuuut, quand j'utilise cette interface utilisateur spécifique, le QMovie ne fonctionne pas. En fait, il ne reste pas en boucle ... Voir, quand j'utilise le QMovie dans l'interface utilisateur que j'ouvre, le QMovie reste en boucle.Problèmes d'utilisation de QMovie avec animation GIF dans un QLabel

Mon anglais n'est pas si bon, mais comprenez-vous mon problème? =/

J'utilise le même code du lien:

this->m_pMovie = new QMovie(":/ui/images/my_image_loading.gif"); 
this->m_pMovie->setScaledSize(QSize(50, 50)); 
this->ui->labelImageLoading->setMovie(this->m_pMovie); 
this->m_pMovie->start(); 

Quelqu'un sait à ce sujet?

Merci ...

Répondre

2

Tout semble bien dans la façon dont vous utilisez le QMovie. C'est juste une supposition, mais je me demande si votre QMovie n'est pas mis à jour parce que le fil de l'interface graphique est trop occupé. Si vous avez une interface utilisateur qui est lente à charger, cette lenteur pourrait être due au fait qu'elle consomme beaucoup de traitement sur le thread graphique. C'est le même thread qui essaie de mettre à jour votre QMovie. Le résultat: votre QMovie n'est jamais mis à jour car il dépend du même thread graphique pour que ses mises à jour soient peintes.

S'il y a n'importe où dans le processus de chargement de l'interface utilisateur où vous pouvez mettre quelques appels à QApplication::processEvents(), cela mettrait le film à jour. Mais il pourrait être agité. Sinon, il n'y a vraiment pas grand-chose à faire, sauf essayer de trouver un moyen de charger ces interfaces plus rapidement. (Séparez-les en différentes fenêtres, simplement les dispositions, cassez en onglets qui se chargent selon les besoins, etc.)

+0

J'ai compris @Dave ... J'avais vraiment utilisé QApplication :: processEvents(), mais j'ai oublié d'écrire ici. Eh bien, en utilisant processEvents() methdos, mon QLabel avec QMovie est affiché mais l'animation reste statique. Mais maintenant je comprends pourquoi ... Parce que la nouvelle interface utilisateur que je suis l'ouverture et mon interface utilisateur de statut de chargement sont dans le même fil, thread GUI, non? Merci pour votre explication! Je vais chercher une autre solution pour cela, mais je crois qu'il ne sera pas possible d'utiliser mon GIF pour charger l'état, car l'autre problème est si je dois ouvrir un autre thread je ne peux pas peindre dans l'IU aussi ... –

+0

Une solution consisterait à générer un tout nouveau processus, QProcess, qui lance une application "waiting ...". Ensuite, tuez le processus une fois l'interface utilisateur chargée. Ensuite, vous avez deux threads GUI (sur deux processus différents). Cela invite ses propres problèmes, bien sûr, et est un peu lourd. Mais cela pourrait fonctionner s'il n'y a aucun moyen de raccourcir le temps de chargement de l'interface principale. –