2012-04-21 9 views
7

Mi piacerebbe mostrare un'animazione .gif in un widget QLabel, accanto al testo.Visualizzazione di un'animazione .gif in QLabel

Il seguente codice non funziona:

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

come l'immagine non verrà animare.

Ho provato achiving che utilizzando un oggetto QMovie:

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

Ma poi non riesco a mettere l'animazione e il testo insieme. Esiste una soluzione diversa oltre all'utilizzo di due etichette diverse?

risposta

14

È possibile aggiungere un layout per l'etichetta, e poi aggiungere un altro etichetta con il testo a quello ...

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...')) 

modificare:

è possibile se si utilizza la propria versione di un QLabel e un QPainter per dipingere il testo da soli:

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

Desidero che l'immagine venga visualizzata subito dopo il testo, come se fosse parte di esso. – iTayb

+1

quindi il modo più semplice è probabilmente quello di utilizzare un widget con QHBoxLayout e QLabel e QMovie fianco a fianco. – mata

1

ho trovato che non c'è modo possibile utilizzare lo stesso widget di questo j ob. Devono essere utilizzati due diversi QLabels.