En utilisant PyQt et Qt4, est-ce la bonne façon d'obtenir un throbber dans un onglet QTabWidget ?

StackOverflow https://stackoverflow.com/questions/3301866

  •  26-09-2020
  •  | 
  •  

Question

J'ai du code créant un QTabWidget à partir de Python en utilisant PyQt4.Je souhaite obtenir un gif animé « throbber » dans l'onglet.La /seule façon/ que j'ai trouvée pour procéder est la méthode alambiquée suivante.

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 renvoie toujours vrai, mais le throbber fonctionne parfois, parfois est vide et a parfois un délai important entre les images.En particulier, je ne peux m'empêcher de penser que connecter le signal frameChanged du film à une fonction qui appelle simplement jumpToFrame sur le même film n'est pas correct.

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

Alors, qu'est-ce que je fais de mal ?

PS :Je me rends compte que .tabBar() est un membre protégé, mais j'ai supposé (apparemment à juste titre) 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.

Était-ce utile?

La solution

Je pense 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 ont permis de détruire le problème C++ sous-jacent.Il est également possible que j'aie eu des problèmes de threading - threading.thread et QThread ne fonctionnent pas bien ensemble.Le code de travail que j'ai maintenant est ci-dessous - pas besoin de jouer avec les signaux ni les emplacements.

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)

Autres conseils

J'ai rencontré le même problème et ce message 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(), soi)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top