在QMovie中加载动画gif数据

时间:2015-06-17 15:03:11

标签: json qt pyside animated-gif

我是Qt(特别是PySide)的新手,我正在尝试编写一个脚本,将文件中的动画gif加载到QByteArray中,然后加载到QMovie中。从文件到QByteArray的原因是因为我无法将gif文件保留在内存中。我希望能够以这样的方式存储动画gif,以便稍后可以将其写入JSON文件(因此QByteArray)。我尝试过使用来自here的ekhumoro答案,虽然没有出现任何错误,但动画gif也没有显示出来。 (可能会有一些东西,但我没有看到任何东西。)简而言之,我的代码看起来像这样:

data = open("img.gif", "rb").read()
self.bArray = QtCore.QByteArray(data)
self.bBuffer = QtCore.QBuffer(self.bArray)
self.bBuffer.open(QtCore.QIODevice.ReadOnly)
self.movie = QtGui.QMovie(self.bBuffer, 'GIF')
self.movieLabel.setMovie(self.movie) # a QLabel
self.movie.start()

我想稍后将self.bArray的内容存储到JSON文件中。

当我向QMovie构造函数提供文件路径时,我可以看到动画gif,但之后我将无法将gif的内容保存到JSON文件中。

我想知道数据是否未正确读取或未正确传递给QMovie。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这看起来像是一个PySide错误,因为相同的代码在PyQt中运行得非常好。

该错误似乎在QMovie构造函数中,它不会从传递给它的设备中读取任何内容。解决方法是明确设置设备,如下所示:

import sys
from PySide import QtCore, QtGui
# from PyQt4 import QtCore, QtGui

app = QtGui.QApplication(sys.argv)

data = open('anim.gif', 'rb').read()
a = QtCore.QByteArray(data)
b = QtCore.QBuffer(a)

print('open: %s' % b.open(QtCore.QIODevice.ReadOnly))

m = QtGui.QMovie()
m.setFormat('GIF')
m.setDevice(b)

print('valid: %s' % m.isValid())

w = QtGui.QLabel()
w.setMovie(m)
m.start()

w.resize(500, 500)
w.show()
app.exec_()

print('pos: %s' % b.pos())