[QT]Problème de repaint() sur un QLabel

Problème de repaint() sur un QLabel [QT] - C++ - Programmation

Marsh Posté le 10-05-2005 à 12:53:20    

Bonjour,
 
Je bosse sur un projet en QT (j'utilise KDevelop sous Fedora 3), et à un endroit j'ai besoin d'afficher un QLabel, faire un sleep, puis modifier ce QLabel.
 
Ca donne quelque chose du genre :

Code :
  1. [...]
  2. QLabel * lbl;
  3. lbl = new Label("blablabla", this);
  4. [...]
  5. lbl->setText("Test 1" );
  6. sleep(1); //Temporisation d'une seconde
  7. lbl->setText("Test 2" );
  8. [...]


 
Donc en théorie, ça devrait m'afficher "Test 1", attendre une seconde, puis remplacer "Test 1" par "Test 2".
 
Le truc c'est que ça marche pas des masses, mon programme s'éxécute correctement, puis arrivé au niveau du sleep, il temporise, mais n'affiche pas "Test 1", puis une fois la tempo terminée, il affiche "Test 2"
 
(En gros, je devrais avoir "Test 1", tempo d'1 seconde, "Test 2", et j'ai tempo d'1 seconde, "Test 2" ).
 
En fait je pense que ça ne raffraichit la fenêtre qu'une fois sorti de la fonction dans laquelle se trouve le code que j'ai mis au dessus.
J'ai donc essayé de forcer le rafraichissement en mettant un repaint, mais ça marche pas :/ (j'ai aussi essayé un update, pareil)
 
Si quelqu'un a une idée de comment faire, je suis preneur parce que ça fait plusieurs heures que je galère là dessus :/
 
Merci d'avance,
Harrysauce

Reply

Marsh Posté le 10-05-2005 à 12:53:20   

Reply

Marsh Posté le 10-05-2005 à 15:59:25    

Salut,
Tu dois laisser les événements être traités par Qt. Quand tu fais ton sleep(), tu freeze totalement l'application. Avoir à disponibilité un slot qui s'occupe de changer l'affichage, afficher "Texte 1" dans ton label, créer un timer single-shot (avec sa méthode statique) d'une durée de 1 sec, et lui demander d'exécuter le slot prévu précédemment.

Reply

Marsh Posté le 05-06-2005 à 12:46:09    

You can force main thread to manage repaint event with call "ProcessEvents" of QApplication.
 
void QApplication::processEvents()
 
Thats all ;-)
 
Alex
 
 

harrysauce a écrit :

Bonjour,
 
Je bosse sur un projet en QT (j'utilise KDevelop sous Fedora 3), et à un endroit j'ai besoin d'afficher un QLabel, faire un sleep, puis modifier ce QLabel.
 
Ca donne quelque chose du genre :

Code :
  1. [...]
  2. QLabel * lbl;
  3. lbl = new Label("blablabla", this);
  4. [...]
  5. lbl->setText("Test 1" );
  6. sleep(1); //Temporisation d'une seconde
  7. lbl->setText("Test 2" );
  8. [...]


 
Donc en théorie, ça devrait m'afficher "Test 1", attendre une seconde, puis remplacer "Test 1" par "Test 2".
 
Le truc c'est que ça marche pas des masses, mon programme s'éxécute correctement, puis arrivé au niveau du sleep, il temporise, mais n'affiche pas "Test 1", puis une fois la tempo terminée, il affiche "Test 2"
 
(En gros, je devrais avoir "Test 1", tempo d'1 seconde, "Test 2", et j'ai tempo d'1 seconde, "Test 2" ).
 
En fait je pense que ça ne raffraichit la fenêtre qu'une fois sorti de la fonction dans laquelle se trouve le code que j'ai mis au dessus.
J'ai donc essayé de forcer le rafraichissement en mettant un repaint, mais ça marche pas :/ (j'ai aussi essayé un update, pareil)
 
Si quelqu'un a une idée de comment faire, je suis preneur parce que ça fait plusieurs heures que je galère là dessus :/
 
Merci d'avance,
Harrysauce


Reply

Marsh Posté le 05-06-2005 à 18:57:38    

Utilise les sleep avec parcimonie. Et surtout jamais dans le GUI thread de QT !!! La methode que te suggere IrmatDen est la seule appropriee a ton probleme.


Message édité par jefe le 05-06-2005 à 18:58:10
Reply

Marsh Posté le 14-06-2005 à 12:55:01    

Ouaip, je sais, c'est ce que j'avais fini par faire :D
 
Merci :jap:

Reply

Marsh Posté le 14-06-2005 à 13:02:00    

Tu ne peux pas utiliser plutot un QWaitCondition ?

Reply

Marsh Posté le 14-06-2005 à 21:29:13    

nathan_g a écrit :

Tu ne peux pas utiliser plutot un QWaitCondition ?


 [:shinji_kun64]  
Où est le rapport ?! Il n'a pas parlé de thread ici...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed