如何在 Python 3 中腌制 QPixmap 对象字典
How to pickle QPixmap object dict in Python 3
我想在 Python 3
中 pickle QPixmap 对象字典
例如,
ImageQpixmapDict = {}
ImageQpixmapDict['XXX'] = QPixmap()
在这种情况下,我想 pickle ImageQpixmapDict 变量
喜欢
pickle.dump(ImageQpixmapDict, 'filePath')
我尝试使用 QSettings 来 pickle QPixmap 对象,但它不起作用。
但是如您所知,无法对 QPixmap 对象进行 pickle。那么,我该如何解决这个问题。
只有一些 Qt classes 是可选的(参见 the docs)并且其中没有 QPixmap,因此解决方案是创建一个派生的 class 来实现该逻辑:
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()
我想在 Python 3
中 pickle QPixmap 对象字典例如,
ImageQpixmapDict = {}
ImageQpixmapDict['XXX'] = QPixmap()
在这种情况下,我想 pickle ImageQpixmapDict 变量
喜欢
pickle.dump(ImageQpixmapDict, 'filePath')
我尝试使用 QSettings 来 pickle QPixmap 对象,但它不起作用。
但是如您所知,无法对 QPixmap 对象进行 pickle。那么,我该如何解决这个问题。
只有一些 Qt classes 是可选的(参见 the docs)并且其中没有 QPixmap,因此解决方案是创建一个派生的 class 来实现该逻辑:
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()