Usando Pyqt e QT4, è questo il modo corretto per ottenere un throbber in una scheda Qtabwidget?

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

  •  26-09-2020
  •  | 
  •  

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.

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top