酸洗 QWidgets 和 类 继承 QWidget

pickling QWidgets and classes inheriting QWidget

我一直在尝试将我的 QTabWidget 中的小部件保存到一个文件中,我可以稍后加载并将保存的小部件作为选项卡添加到当前 window。

我的方法是尝试使用 pickle,但是 pickle.dump returns 类型错误。

是否可以保存 QWidgets?

我已经定义了一个自定义 canvas class 继承 QWidget,其中包含 QGraphicsScene 和视图如下。

class canvas(QWidget):
    def __init__(self, parent=None):
        super(canvas, self).__init__(parent)

        self.painter = QGraphicsScene(0, 0, 794, 1123)
        self.resize(794, 1123)
        self.painter.setBackgroundBrush(QBrush(Qt.white))
        self.view = QGraphicsView(self.painter)
        self.layout = QHBoxLayout(self)
        self.layout.addWidget(self.view)
        self.setLayout(self.layout)

然后添加到 QTabWidget。

我只想将我的 canvas class 的对象列表保存到文件

这是一个最小的可重现示例。

if __name__ == "__main__":
    tabs = []
    tabs.append(canvas())
    tabs.append(canvas())
    tabs.append(canvas())
    pickle.dump(tabs, open('test','w'))

以下解决方案对我有用,请注意所有添加到 painter 的项目都需要子类化,以便添加 getstate 和 setstate 属性。 但是我还没有针对 QGraphicsScene 中的项目测试它

def __getstate__(self) -> dict:
    return {
        "_classname_": self.__class__.__name__,
        "ObjectName": self.objectName(),
        "items": [i.__getState__() for i in self.painter.items()]
    }
def __setstate__(self, dict):
    self.__init__()
    self.setObjectName(dict['ObjectName'])
    for item in dict['items']:
        graphic =  getattr(graphics, dict['_classame_'])
        graphic.__setstate__(item)
        self.painter.addItem(graphic)