2010-07-21 17 views
2

J'ai du code créant un QTabWidget à partir de Python en utilisant PyQt4. Je veux obtenir un gif animé "throbber" dans l'onglet. La seule manière/J'ai trouvé comment faire ceci est la méthode compliquée suivante.En utilisant PyQt et Qt4, est-ce la bonne façon d'obtenir un throbber dans un onglet QTabWidget?

tabBar = self.tabReports.tabBar() 
lbl = QtGui.QLabel(self.tabReports) 
movie = QtGui.QMovie(os.path.join(self.basedir, "images\\throbber.gif")) 
lbl.setMovie(movie) 
QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), lambda i: movie.jumpToFrame(i)) 
movie.start() 
log.debug("valid = %s"%(movie.isValid())) 
tabBar.setTabButton(idxtab, QtGui.QTabBar.LeftSide, lbl) 

L'appel de débogage retourne toujours vrai, mais le throbber fonctionne parfois, est parfois vide, et a parfois un grand retard laid entre les images. En particulier, je ne peux m'empêcher de penser que la connexion du signal frameChanged du film à une fonction qui appelle simplement jumpToFrame sur le même film n'est pas correcte.

Encore plus pénible, si je laisse tomber simplement le lambda (c'est-à-dire, faites la ligne dire QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), movie.jumpToFrame) il ne rend jamais même la première image.

Alors, qu'est-ce que je fais de mal? PS: Je réalise que .tabBar() est un membre protégé, mais j'ai supposé (apparemment correctement) que PyQt déprotège les membres protégés :). Je suis nouveau sur Qt, et je préfère ne pas sous-classer QTabWidget si je peux l'aider.

Répondre

3

Je crois que le problème avec le code que j'ai initialement publié était que QMovie n'avait pas de parent, et donc les problèmes de portée permettaient de détruire le problème C++ sous-jacent. Il est également possible que j'ai eu des problèmes de threading - threading.thread et QThread ne jouent pas bien ensemble. Le code de travail que j'ai maintenant est ci-dessous - pas de gâchis avec les signaux ni les fentes nécessaires.

def animateTab(self, tab_widget, enable): 
    tw = tab_widget 
    tabBar = tw.tabBar() 
    if enable: 
     lbl = QtGui.QLabel(tw) 
     movie = QtGui.QMovie("images\\throbber.gif"), parent=lbl) 
     movie.setScaledSize(QtCore.QSize(16, 16)) 
     lbl.setMovie(movie) 
     movie.start() 
    else: 
     lbl = QtGui.QLabel(tw) 
     lbl.setMinimumSize(QtCore.QSize(16, 16)) 
    tabBar.setTabButton(tab_section.index, QtGui.QTabBar.LeftSide, lbl) 
1

J'ai fait face au même problème et cette annonce a aidé à le faire fonctionner: http://www.daniweb.com/forums/printthread.php?t=191210&pp=40

Pour moi, cela semble faire la différence: QMovie ("image.gif", QByteArray(), auto)

+1

En effet, c'était aussi un problème avec les parents. L'argument self est le "parent" du widget C++ - sans cela, l'objet C++ mourra après le retour de votre méthode. Avec lui, il ne mourra que lorsque l'objet C++ «self» sera attaché aux matrices. J'ai trouvé qu'il est préférable de faire semblant de travailler en C++ pour travailler avec PyQt, et d'utiliser python pour une syntaxe plus agréable :) –