2012-04-21 22 views
7

Me gustaría mostrar una animación .gif en un widget QLabel, junto con el texto.Mostrando una animación .gif en QLabel

El siguiente código no funcionará:

self.status_txt = QtGui.QLabel('Loading... <img src="etc/loading.gif">') 

como la imagen no va a animar.

He intentado achiving mediante el uso de un objeto QMovie:

self.status_txt = QtGui.QLabel("Loading...") 
movie = QtGui.QMovie("etc/loading.gif") 
self.status_txt.setMovie(movie) 
movie.start() 

Pero entonces no puedo poner la animación y el texto en conjunto. ¿Existe una solución diferente además de usar dos etiquetas diferentes?

Respuesta

14

se puede añadir un diseño de la etiqueta, y luego añadir otra etiqueta con el texto para que ...

self.status_txt = QtGui.QLabel() 
movie = QtGui.QMovie("etc/loading.gif") 
self.status_txt.setMovie(movie) 
movie.start() 
self.status_txt.setLayout(QtGui.QHBoxLayout()) 
self.status_txt.layout().addWidget(QLabel('Loading...')) 

edición:

es posible si usted utiliza su propia versión de un QLabel y una QPainter para pintar el texto mismo:

from PyQt4.QtCore import QSize 
from PyQt4.QtGui import QApplication, QLabel, QMovie, QPainter, QFontMetrics 

class QTextMovieLabel(QLabel): 
    def __init__(self, text, fileName): 
     QLabel.__init__(self) 
     self._text = text 
     m = QMovie(fileName) 
     m.start() 
     self.setMovie(m) 

    def setMovie(self, movie): 
     QLabel.setMovie(self, movie) 
     s=movie.currentImage().size() 
     self._movieWidth = s.width() 
     self._movieHeight = s.height() 

    def paintEvent(self, evt): 
     QLabel.paintEvent(self, evt) 
     p = QPainter(self) 
     p.setFont(self.font()) 
     x = self._movieWidth + 6 
     y = (self.height() + p.fontMetrics().xHeight())/2 
     p.drawText(x, y, self._text) 
     p.end() 

    def sizeHint(self): 
     fm = QFontMetrics(self.font()) 
     return QSize(self._movieWidth + 6 + fm.width(self._text), 
       self._movieHeight) 

    def setText(self, text): 
     self._text = text 

if __name__ == '__main__': 
    import sys 
    app = QApplication(sys.argv) 
    l = QTextMovieLabel('Loading...', 'loading.gif') 
    l.show() 
    app.exec_() 
+0

Quiero que la imagen se muestre justo después del texto, como si fuera una parte. – iTayb

+1

entonces la forma más fácil es probablemente usar un widget con QHBoxLayout y QLabel y QMovie uno al lado del otro. – mata

1

he encontrado que no hay manera posible de utilizar el mismo artilugio para este j transmisión exterior. Deben usarse dos QLabels diferentes.