Python PyQt使用适当的抗锯齿调整QMovie的大小
我创建了一个QLabel,并将其电影设置为带有动画gif的QMovie对象。然后在我的应用程序的resizeEvent中,我调整并移动标签,使其居中/适合布局。这很好,但电影中有很多细线,在调整大小操作中完全被弄乱了,似乎没有抗锯齿。因此,要么我使用了错误的调整大小方法,要么我需要将抗锯齿设置在正确的位置?QMovie或QLabel文档中没有建议如何执行此操作。我确实读到QMovie是从一个QImageReader继承的,尽管它也没有我能找到的抗锯齿属性 编辑 我确实做了一些工作,但仍然不太正确。我发现QMovie有一个setScaledSize方法,它实际上可以缩放底层的QImageViewer。然后我只是让标签调整到它的内容,即电影。使用下面的代码,我可以通过适当的抗锯齿来调整电影的大小,但是在调整大小的过程中,它是非常“跳跃”和“闪烁”的,所以很明显我做的不是非常“正确”。有时它也会失去它的纵横比。仍然在寻找正确的方法来做到这一点。。。也许QLabel是错误的选择 这里有一个有效的例子Python PyQt使用适当的抗锯齿调整QMovie的大小,python,pyqt,pyqt4,qlabel,Python,Pyqt,Pyqt4,Qlabel,我创建了一个QLabel,并将其电影设置为带有动画gif的QMovie对象。然后在我的应用程序的resizeEvent中,我调整并移动标签,使其居中/适合布局。这很好,但电影中有很多细线,在调整大小操作中完全被弄乱了,似乎没有抗锯齿。因此,要么我使用了错误的调整大小方法,要么我需要将抗锯齿设置在正确的位置?QMovie或QLabel文档中没有建议如何执行此操作。我确实读到QMovie是从一个QImageReader继承的,尽管它也没有我能找到的抗锯齿属性 编辑 我确实做了一些工作,但仍然不太正确
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()
好的,我现在已经弄明白了,在我编辑的帖子中对代码做了一些调整。秘密在于将标签保持为其父rect的完整大小(在本例中为整个布局的大小),然后在标签内缩放电影。实际上,您是在内部缩放电影,而不是让它自动填充标签的内容。据我所知,这会改变操作顺序,并允许电影在渲染时自行缩放,而不是渲染帧然后将其缩放到标签大小 工作代码:
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()
提供并共享您的giffile@eyllanesc对不起,这里有一个更好的例子。我现在无法上传gif,但我认为任何人都可以。例如@eyllanesc,我更接近于一个解决方案。我发现QMovie确实有QMovie.setScaledSize()用于缩放图像读取器。因此,我没有缩放标签,而是缩放电影,然后调用QLabel.adjustSize()使标签适合电影。这有点“神经质”,但确实有效。我将稍后发布我的代码。按照另一篇文章中的建议,发布一个答案并将其标记为正确。@eyllanesc答案还没有准备好,我仍然有问题,所以我不认为这是一个合适的解决方案。这个解决方案不起作用。我的问题是否有人能给我这个问题的答案@raghava需要更多的数据…我已经使用这个代码一段时间了,它肯定有效。@Spencer,你是否为这个应用启用了
HighDPIScaling
?因为对我来说,如果启用HighDPIScaling,缩放后的gif将变得完全像素化: