2009-11-19 14 views
0

Mon problème est que je veux continuer à tourner la scène si la case est cochée, et arrêter cette rotation immédiatement une fois qu'elle n'est pas cochée. Cependant, "continuer à tourner" signifie une boucle infinie ...Comment décocher une case pour arrêter le dessin infini dans pyqt?

Donc, après être entré dans la boucle, le programme devient un peu gelé et ne réagit plus à mon signal "décocher". Y a-t-il un moyen d'interrompre cette boucle? Ce qui suit est le squelette du code associé. Merci!

class Draw(QGLWidget):  
    def __init__(...): 
     ... 
     self.rotate=0 
     self.auto=False 

    def paintGL(self): 
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) 
     glLoadIdentity() 

     glRotatef(self.rotate,0.0,0.0,1.0) 
     draw stuff... 

     glFlush() 

    def autoRotate(self,auto): # auto is an integer and used here as true/false 
     self.auto=auto 
     while self.auto: 
      self.rotate+=0.5 
      if self.rotate>360: 
       self.rotate-=360 
      self.updateGL() 
      if auto==False: 
       break 


class SpiralWidgetDemo(QtGui.QMainWindow): 
    def __init__(self): 
     ... 
     auto=QtGui.QCheckBox("Auto") 
     self.connect(auto,QtCore.SIGNAL("stateChanged(int)"),widget.autoRotate) 

Répondre

1

Vous ne devez pas implémenter ceci comme une boucle. Ceci est défini pour rompre l'interaction du programme, car il empêche l'exécution de la "boucle principale" de l'application Qt. Mettez votre code de dessin dans un gestionnaire d'événements (comme un événement de redessin) et utilisez un temporisateur pour générer des événements à intervalles réguliers (par exemple 10/s).

+0

Votre réponse est très précise, problème résolu. Je vous remercie! – mayasky