Я создал QLabel и установил его фильм на объект QMovie с анимированным gif. Затем в 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()