2012-04-21 12 views
7

Tôi muốn hiển thị hình động .gif trong tiện ích QLabel, cùng với văn bản.Hiển thị hình động .gif trong QLabel

Đoạn mã dưới đây sẽ không làm việc:

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

như hình ảnh sẽ không sinh động.

Tôi đã cố gắng achiving nó bằng cách sử dụng một đối tượng QMovie:

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

Nhưng sau đó tôi không thể đặt các hình ảnh động và các văn bản với nhau. Có giải pháp nào khác ngoài việc sử dụng hai nhãn khác nhau không?

Trả lời

14

bạn có thể thêm một Layout để nhãn, và sau đó thêm Label khác với văn bản để mà ...

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

chỉnh sửa:

nó có thể nếu bạn sử dụng phiên bản của riêng bạn một QLabel và một QPainter để tự vẽ văn bản:

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

Tôi muốn hình ảnh hiển thị ngay sau văn bản, như là một phần của văn bản. – iTayb

+1

thì cách dễ nhất có thể là sử dụng tiện ích con với QHBoxLayout và QLabel và bên QMovie cạnh nhau. – mata

1

Tôi đã tìm thấy rằng không thể sử dụng cùng một tiện ích cho tiện ích này ob. Hai QLabels khác nhau phải được sử dụng.