2010-10-14 5 views
1

J'utilise un QTimer et connecte son signal de temporisation à la méthode animate(). Dans animate(), j'affiche un QPushButton à différentes positions en utilisant une boucle. Le problème est que le QPushButton n'est pas visible jusqu'à ce que la boucle soit terminée. Cela devrait donner l'effet d'un objet en mouvement. Ce qui suit est le code Qt Jambi:Qt: changer la position d'un widget rapidement dans une boucle le rend invisible pour la durée de la boucle. Pourquoi?

QTimer t=new QTimer(); 
    t.timeout.connect(this,tr("animate()")); 
    t.setSingleShot(true); 
    t.start(0); 

Ce qui suit est le Animate() fonction:

void animate() 
    { 
     QPushButton a=new QPushButton(new QIcon("../Desktop/images/kya/32x32/down.png"),new String().format("%.1f",browser.page().totalBytes()/1024.0)+" KB"); 
     a.setFont(new QFont("Impact",20,QFont.Weight.Light.value())); 
     int x,y,bx=130,by=50; //bx and by are the width and height of the pushbutton 
     a.setEnabled(false); 
      a.show(); 
     for (x=QApplication.desktop().width()-bx,y=QApplication.desktop().height()/2+80;y<QApplication.desktop().height()-by;y+=5) 
     { 
      try{Thread.sleep(100);}catch(Exception e){System.out.println(e);} 
      a.setGeometry(x,y,bx,by); 
      a.update(x,y,bx,by); 
      a.show(); 
     } 
    } 

Répondre

4

L'appel à a.update() affiche un message au boucle d'événements de Qt afin de l'interface graphique ne peut pas mettre à jour jusqu'à ce que le traitement des déclarations de la boucle d'événement (après avoir quitté votre fonction animée).

Vous pouvez configurer une minuterie à allumer à la vitesse à laquelle vous voulez animer le bouton et dans la fente, incrémenter vos variables d'un pas et régler la position du bouton. Ensuite, l'animation du bouton avancera chaque fois que la minuterie se déclenchera.

Une meilleure solution serait d'utiliser la classe QPropertyAnimation de The Animation Framework pour animer votre bouton.

+1

P.S. Veuillez revoir les réponses à vos questions précédentes pour voir s'il y en a que vous pouvez "accepter". –

+0

Merci. Je comprends qu'il n'y a qu'un seul thread (appelé le thread GUI) qui peut modifier les éléments de l'interface graphique, et comme tous les threads, il a une boucle d'événements qui fournit les événements pour cela. a.update() publie l'événement dans la boucle d'événement du thread de l'interface graphique. Qu'est-ce qu'on entend par retour à la boucle de message? D'où ? Quelle est cette boucle de message? – Daud

+0

Désolé pour la confusion. La boucle de message est la boucle d'événement, ils sont juste des termes communs pour la même chose. J'ai édité ma réponse pour n'en utiliser qu'un seul. –