Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt使用适当的抗锯齿调整QMovie的大小_Python_Pyqt_Pyqt4_Qlabel - Fatal编程技术网

Python PyQt使用适当的抗锯齿调整QMovie的大小

Python PyQt使用适当的抗锯齿调整QMovie的大小,python,pyqt,pyqt4,qlabel,Python,Pyqt,Pyqt4,Qlabel,我创建了一个QLabel,并将其电影设置为带有动画gif的QMovie对象。然后在我的应用程序的resizeEvent中,我调整并移动标签,使其居中/适合布局。这很好,但电影中有很多细线,在调整大小操作中完全被弄乱了,似乎没有抗锯齿。因此,要么我使用了错误的调整大小方法,要么我需要将抗锯齿设置在正确的位置?QMovie或QLabel文档中没有建议如何执行此操作。我确实读到QMovie是从一个QImageReader继承的,尽管它也没有我能找到的抗锯齿属性 编辑 我确实做了一些工作,但仍然不太正确

我创建了一个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()

好的,我现在已经弄明白了,在我编辑的帖子中对代码做了一些调整。秘密在于将标签保持为其父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将变得完全像素化: