我创建了一个QLabel并将其电影设置为带有动画gif的QMovie对象。然后在我的应用程序的resizeEvent中,我调整大小并移动标签,使其居中/适合布局。这样工作正常,但电影有很多细线在调整大小操作中完全乱码,似乎没有抗锯齿。所以要么我使用错误的调整大小方法,要么我需要在某处设置抗锯齿? QMovie或QLabel文档中没有任何内容可以建议如何执行此操作。我确实读过QMovie继承自QImageReader,虽然它也没有我可以找到的抗锯齿属性。
修改
我确实做了一些工作,但它仍然不太正确。我发现QMovie有一个setScaledSize方法,它实际上扩展了底层的QImageViewer。然后我就让标签调整到它的内容,即电影。使用下面的代码,我能够通过适当的抗锯齿来调整电影的大小,但是在调整大小时它非常“跳跃”和“闪烁”,所以显然我并没有这么做“正确”。它有时会以某种方式失去它的纵横比。仍然在寻找正确的方法来做到这一点......也许QLabel是错误的方式?
这是一个有效的例子
import sys
from PyQt4 import QtGui
class MovieTest(QtGui.QDialog):
def __init__(self):
super(MovieTest, self).__init__()
layout = QtGui.QVBoxLayout()
self.setLayout(layout)
self.loading_lbl = QtGui.QLabel()
self.loading_lbl.setSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicyIgnored)
self.loading_lbl.setScaledContents(True)
layout.addWidget(self.loading_lbl)
loading_movie = QtGui.QMovie("loading-radial_loop.gif") # some gif in here
self.loading_lbl.setMovie(loading_movie)
loading_movie.start()
self.setGeometry(50,50,100,100)
self.setMinimumSize(10,10)
def resizeEvent(self, event):
rect = self.geometry()
size = min(rect.width(), rect.height())
movie = self.loading_lbl.movie()
movie.setScaledSize(QtCore.QSize(size, size))
self.loading_lbl.adjustSize()
def main():
app = QtGui.QApplication(sys.argv)
ex = MovieTest()
ex.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
答案 0 :(得分:2)
好的,我现在已经解决了这个问题,只需对我编辑的帖子中的代码进行一些调整。秘诀在于使标签保持其父级矩形的整个大小(在这种情况下是整个布局的大小),然后在标签内缩放电影。基本上你是在内部缩放电影,而不是让它自动填充标签的内容。据我所知,这会改变操作的顺序,并允许电影在渲染时缩放,而不是渲染帧然后将其缩放到标签大小。
工作代码:
import sys
from PyQt4 import QtGui, QtCore
class MovieTest(QtGui.QDialog):
def __init__(self):
super(MovieTest, self).__init__()
layout = QtGui.QVBoxLayout()
self.setLayout(layout)
self.loading_lbl = QtGui.QLabel()
self.loading_lbl.setStyleSheet('border: 1px solid red') # just for illustration
self.loading_lbl.setAlignment(QtCore.Qt.AlignCenter)
layout.addWidget(self.loading_lbl)
loading_movie = QtGui.QMovie("loading-radial_loop.gif")
self.loading_lbl.setMovie(loading_movie)
loading_movie.start()
self.setGeometry(50,50,100,100)
self.setMinimumSize(10,10)
def resizeEvent(self, event):
rect = self.geometry()
size = QtCore.QSize(min(rect.width(), rect.height()), min(rect.width(), rect.height()))
movie = self.loading_lbl.movie()
movie.setScaledSize(size)
def main():
app = QtGui.QApplication(sys.argv)
ex = MovieTest()
ex.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()