我是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。
有什么想法吗?
谢谢!
答案 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())