酸洗 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)
我一直在尝试将我的 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)