【问题标题】:Showing a .gif animation in QLabel在 QLabel 中显示 .gif 动画
【发布时间】:2020-09-01 05:23:52
【问题描述】:

我想在 QLabel 小部件中与文本一起显示 .gif 动画。

以下代码不起作用:

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

因为图像不会动画。

我尝试使用QMovie 对象来实现它:

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

但是我不能把动画和文本放在一起。 除了使用两个不同的标签,还有其他的解决方案吗?

【问题讨论】:

    标签: qt4 pyqt4 animated-gif


    【解决方案1】:

    你可以给标签添加一个布局,然后再添加另一个带有文本的标签...

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

    编辑

    如果您使用自己版本的 QLabel 和 QPainter 自己绘制文本,这是可能的:

    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_()
    

    【讨论】:

    • 我希望图像显示在文本之后,就像它是文本的一部分一样。
    • 那么最简单的方法可能是并排使用带有 QHBoxLayout 和 QLabel 的小部件和 QMovie。
    【解决方案2】:

    简短的回答:

    movie = QtGui.QMovie('file.gif')
    my_label.setMovie(movie)
    movie.start()
    

    注意这里的import语句是from PyQt5 import QtCore, QtGui, QtWidgets,这是Qt Designer默认生成的。

    【讨论】:

    • 这确实似乎是截至 2022 年迄今为止的最佳解决方案,因为它简短而直截了当。另一个接受的答案似乎更深入,但可能已经过时了。
    【解决方案3】:

    我发现不可能为这项工作使用相同的小部件。必须使用两个不同的 QLabel。

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 2012-09-15
      • 2013-03-14
      • 1970-01-01
      • 2012-06-07
      • 2019-01-04
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多