Как выбрать объект QPixmap dict в Python 3 - PullRequest
2 голосов
/ 16 июня 2020

Я хочу выделить объектный dict QPixmap в Python 3

Например,

ImageQpixmapDict = {}
ImageQpixmapDict['XXX'] = QPixmap() 

В этой ситуации я хочу выбрать переменную ImageQpixmapDict

как

pickle.dump(ImageQpixmapDict, 'filePath')

Я пытался мариновать объект QPixmap с помощью QSettings, но это не сработало.

Но, как вы знаете, объект QPixmap нельзя было мариновать. Итак, как мне решить эту проблему.

1 Ответ

2 голосов
/ 16 июня 2020

Доступны только некоторые классы Qt (см. документацию ), и среди них нет QPixmap, поэтому решение состоит в создании производного класса, который реализует этот logi c:

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