Usando Pyqt e QT4, è questo il modo corretto per ottenere un throbber in una scheda Qtabwidget?
Domanda
Ho qualche codice creando un qtabwidget da Python utilizzando PYQT4.Voglio ottenere un GIF animato "Throbber" nella scheda.Il / unico modo / ho trovato come fare questo è il seguente metodo contorto.
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)
.
La chiamata di debug restituisce sempre true, ma il Throbber a volte funziona, a volte è vuoto, ea volte ha un grande cattivo ritardo tra i frame.In particolare, non posso fare a meno di pensare a collegare il segnale framechanged dal film a una funzione che chiama semplicemente JUMPTOFRAME sullo stesso film non è corretto.
Ancora più angosciante, se semplicemente abbandonisco la Lambda (cioè, rendi la linea QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), movie.jumpToFrame
) Non riesce mai a rendering nemmeno il primo frame.
Allora, cosa sto facendo male?
PS: I Realizza .tabbar () è un membro protetto, ma ho assunto (apparentemente correttamente) che Pyqt non elabora i membri protetti :).Sono nuovo a qt, e preferirei non sottoclasse qtabwidget se posso aiutarlo.
Soluzione
Credo che il problema con il codice che ho inizialmente pubblicato è stato che il qmovie non aveva un genitore, e quindi le questioni di ambienti hanno permesso che il problema di C ++ sottostante sia distrutto.È anche possibile che avessi avuto problemi di threading - threading.thread e qthread non giocare bene insieme.Il codice di lavoro che ho ora è sotto - nessuna scherminazione con segnali né slot necessari.
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)
. Altri suggerimenti
Ho affrontato lo stesso problema e questa pubblicazione ha aiutato a farlo funzionare: http://www.daniweb.com/forums/printthread.php?t= 191210 e amp; pp= 40
Per me questo sembra fare la differenza: qmovie ("image.gif", qbytearray (), auto)