Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python 3中pickle QPixmap对象dict_Python_Python 3.x_Pyqt_Pyqt5_Qpixmap - Fatal编程技术网

如何在Python 3中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,因此解决方案

我想在Python3中pickle QPixmap对象dict

比如说,

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()