Usando PYQT y QT4, ¿es esta la forma correcta de obtener una ficha en una pestaña Qtabwidget?

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

  •  26-09-2020
  •  | 
  •  

Pregunta

Tengo algún código creando un Qtabwidget de Python usando PyqT4.Quiero obtener un GIF animado de 'Throber' en la pestaña.El / only Way / Yo he encontrado cómo hacerlo es el siguiente método complicado.

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 llamada de depuración siempre devuelve verdadera, pero la paladilla a veces funciona, a veces está en blanco y, a veces, tiene un gran retraso feo entre los marcos.En particular, no puedo evitar pensar que conectar la señal FrameChanged de la película a una función que simplemente llama a JumpToFrame en la misma película no es correcta.

Aún más angustiante, si simplemente cae la lambda (es decir, haz que la línea sea que digan QtCore.QObject.connect(movie, QtCore.SIGNAL("frameChanged(int)"), movie.jumpToFrame) nunca hace que sea el primer cuadro.

Entonces, ¿qué estoy haciendo mal?

PS: Me doy cuenta de .tabbar () es un miembro protegido, pero asumí (aparentemente correctamente) que PYQT no protege a los miembros protegidos :).Soy nuevo en QT, y preferiría no subclase Qtabwidget si puedo ayudarlo.

¿Fue útil?

Solución

Creo que el problema con el código que inicialmente publiqué fue que el Qmovie no tenía padre, y por lo tanto, los problemas de alcance permitieron que se destruyera el problema subyacente de C ++.También es posible que hubiera tenido problemas de roscado, enhebrado. Thread y QThread no juegan bien juntos.El código de trabajo que ahora tengo ahora está a continuación, sin interrupciones con señales ni ranuras necesarias.

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)

Otros consejos

Me enfrenté el mismo problema y esta publicación ayudó a hacer que funcione: http://www.daniweb.com/forums/printhread.php?t= 191210 & pp= 40

Para mí, esto parece marcar la diferencia: qmovie ("image.gif", qbytearray (), yo)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top