【问题标题】:Saving class data containing pyqt objects保存包含 pyqt 对象的类数据
【发布时间】:2017-09-10 13:15:23
【问题描述】:

我正在构建一个 PyQt 应用程序,而且我是 python 的初学者。假设我将一个 obj 项存储在定义的类中:

class Item (self):
    def __init__(self, item_nbr, crop_pixmap, originepoint, designation):
        self.item_nbr = item_nbr            # integer
        self.crop_pixmap = crop_pixmap      # QPixmap
        self.origin_point = originpoint     # QPoint
        self.designation = designation      # str

然后我通过一个 GUI 执行其他操作并创建一个项目列表。如何保存此列表以便稍后打开? pickle 不适用于 QPixmap,我想保存一个。

【问题讨论】:

  • 您需要自己为QPixmap定义__setstate____getstate__方法。阅读doc
  • 我为 PyQt5 制作了一个通用的pickler,请参阅下面的答案。

标签: python pyqt saving-data


【解决方案1】:

您可以使用QSettings 来保存您的所有应用程序数据。它会自动转换QPixmapQPointQColor等数据类型。默认情况下,设置保存在platform-independant way中,但您也可以根据需要保存到自定义位置。

这里是你如何读/写你的Item类:

def settings(self):
    # use a custom location
    return QtCore.QSettings('app.conf', QtCore.QSettings.IniFormat)

def readSettings(self):
    self.items = []
    settings = self.settings()
    for index in range(settings.beginReadArray('items')):
        settings.setArrayIndex(index)
        self.items.append(Item(
            settings.value('number', -1, int),
            settings.value('pixmap', None, QtGui.QPixmap),
            settings.value('point', None, QtCore.QPoint),
            settings.value('designation', '', str),
            ))

def writeSettings(self):
    settings = self.settings()
    settings.beginWriteArray('items')
    for index, item in enumerate(self.items):
        settings.setArrayIndex(index)
        settings.setValue('number', item.item_nbr)
        settings.setValue('pixmap', item.crop_pixmap)
        settings.setValue('point', item.origin_point)
        settings.setValue('designation', item.designation)
    settings.endArray()

QSettings.value() 的 PyQt 版本允许您指定默认值和值的预期类型。

【讨论】:

  • 完美的正是我想要的我喜欢你的建议
猜你喜欢
  • 1970-01-01
  • 2019-11-11
  • 2019-03-02
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2017-12-16
相关资源
最近更新 更多