如何在Python 3中pickle QPixmap对象dict
我想在Python3中pickle QPixmap对象dict 比如说,如何在Python 3中pickle QPixmap对象dict,python,python-3.x,pyqt,pyqt5,qpixmap,Python,Python 3.x,Pyqt,Pyqt5,Qpixmap,我想在Python3中pickle QPixmap对象dict 比如说, ImageQpixmapDict = {} ImageQpixmapDict['XXX'] = QPixmap() 在这种情况下,我想pickle ImageQpixmapDict变量 像 我试图通过使用QSettings来pickle QPixmap对象,但它不起作用 但正如您所知,QPixmap对象不能被pickle。因此,我如何解决这个问题。只有一些Qt类是可选择的(请参阅),其中没有QPixmap,因此解决方案
ImageQpixmapDict = {}
ImageQpixmapDict['XXX'] = QPixmap()
在这种情况下,我想pickle ImageQpixmapDict变量
像
我试图通过使用QSettings来pickle QPixmap对象,但它不起作用
但正如您所知,QPixmap对象不能被pickle。因此,我如何解决这个问题。只有一些Qt类是可选择的(请参阅),其中没有QPixmap,因此解决方案是创建一个实现该逻辑的派生类:
import pickle
from PyQt5 import QtCore, QtGui
class Pickable_QPixmap(QtGui.QPixmap):
def __reduce__(self):
return type(self), (), self.__getstate__()
def __getstate__(self):
ba = QtCore.QByteArray()
stream = QtCore.QDataStream(ba, QtCore.QIODevice.WriteOnly)
stream << self
return ba
def __setstate__(self, ba):
stream = QtCore.QDataStream(ba, QtCore.QIODevice.ReadOnly)
stream >> self
if __name__ == "__main__":
import sys
app = QtGui.QGuiApplication(sys.argv)
# create QPixmap
pixmap = QtGui.QPixmap(100, 100)
pixmap.fill(QtGui.QColor("red"))
with open("data.pickle", "wb") as f:
image_dict = dict()
image_dict["XXX"] = Pickable_QPixmap(
pixmap
) # convert QPixmap to Pickable_QPixmap
pickle.dump(image_dict, f)
with open("data.pickle", "rb") as f:
image_dict = pickle.load(f)
pixmap = image_dict["XXX"]
qpixmap = QtGui.QPixmap(pixmap) # convert Pickable_QPixmap to QPixmap
assert qpixmap.size() == pixmap.size() == QtCore.QSize(100, 100)
assert qpixmap.toImage() == pixmap.toImage()
导入pickle
从PyQt5导入QtCore、QtGui
类可拾取的QPixmap(QtGui.QPixmap):
定义减少(自):
返回类型(self),(),self.\uu getstate\uuuuu()
定义获取状态(自身):
ba=QtCore.QByteArray()
stream=QtCore.QDataStream(ba,QtCore.QIODevice.WriteOnly)
流>自我
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=QtGui.qgui应用程序(sys.argv)
#创建QPixmap
pixmap=QtGui.QPixmap(100100)
pixmap.fill(QtGui.QColor(“红色”))
以open(“data.pickle”、“wb”)作为f:
image_dict=dict()
image_dict[“XXX”]=可拾取的_QPixmap(
像素地图
)#将QPixmap转换为可拾取的"QPixmap
pickle.dump(图_dict,f)
以open(“data.pickle”、“rb”)作为f:
image\u dict=pickle.load(f)
pixmap=image_dict[“XXX”]
qpixmap=QtGui.qpixmap(pixmap)#将可拾取的qpixmap转换为qpixmap
断言qpixmap.size()==pixmap.size()==QtCore.QSize(100100)
断言qpixmap.toImage()==pixmap.toImage()
QPixmap
有一个save
方法,你不能使用它吗?Iain Shelvington不,我想保存的不是Img文件,而是二进制数据(包括变量信息,比如pickle)
import pickle
from PyQt5 import QtCore, QtGui
class Pickable_QPixmap(QtGui.QPixmap):
def __reduce__(self):
return type(self), (), self.__getstate__()
def __getstate__(self):
ba = QtCore.QByteArray()
stream = QtCore.QDataStream(ba, QtCore.QIODevice.WriteOnly)
stream << self
return ba
def __setstate__(self, ba):
stream = QtCore.QDataStream(ba, QtCore.QIODevice.ReadOnly)
stream >> self
if __name__ == "__main__":
import sys
app = QtGui.QGuiApplication(sys.argv)
# create QPixmap
pixmap = QtGui.QPixmap(100, 100)
pixmap.fill(QtGui.QColor("red"))
with open("data.pickle", "wb") as f:
image_dict = dict()
image_dict["XXX"] = Pickable_QPixmap(
pixmap
) # convert QPixmap to Pickable_QPixmap
pickle.dump(image_dict, f)
with open("data.pickle", "rb") as f:
image_dict = pickle.load(f)
pixmap = image_dict["XXX"]
qpixmap = QtGui.QPixmap(pixmap) # convert Pickable_QPixmap to QPixmap
assert qpixmap.size() == pixmap.size() == QtCore.QSize(100, 100)
assert qpixmap.toImage() == pixmap.toImage()