травление QWidget и классов, наследующих QWidget - PullRequest
0 голосов
/ 22 апреля 2020

Я пытался сохранить виджеты в моем QTabWidget в файл, который позже смог бы загрузить и добавить сохраненные виджеты в виде вкладок в текущем окне.

Однако мой подход пытался использовать pickle pickle.dump возвращает ошибку типа.

Возможно ли сохранить QWidgets?

Я определил пользовательский класс canvas, наследующий 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 в файл

Вот минимальный воспроизводимый пример.

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

1 Ответ

0 голосов
/ 22 апреля 2020

Следующее решение сработало для меня, обратите внимание, что все элементы, которые добавляются в художник, должны быть разделены на подклассы, чтобы добавить свойства 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)
...