Добрый день, господа!
Впервые прошу помощи на форуме python-сообщества, потому если что не так - не судите строго)
Описываю задачу:
Создаю некий редактор (если кто в теме, то почти аналог RPGMaker'a, по крайней мере по сути)
Код приложить не могу, ибо в нем оч-чень много модулей. Но суть, имеющая отношение к загвоздке, такова. Есть класс Project - это данные о проекте. Среди прочих данных он содержит структуры проекта, которая представляет из себя некое дерево, которое может содержать либо группы (аналог каталогов), либо сцены (конечные элементы). Пусть, скажем, дерево выглядит примерно так:
Корень (название проекта)
|——– Группа 1
|——– Группа 2
|——– Сцена 1
|——– Сцена 2
|——– Сцена 3
|——– Группа 3
|——– Сцена 4
|——– Сцена 5
|——– Сцена 6
Для ее представления на данном этапе ПЫТАЮСЬ использовать QTreeView. При нажатии мышью на каждый из элементов, всплывает меню а-ля “Создать новую группу/ создать новую сцену”, затем открывается окно с настройками создаваемого элемента, затем этот элемент привязывается к родителю и отображается на виджете. Пока проблем никаких - можно выбирать разные сцены, они корректно обрабатываются и отображаются на другом виджете, можно создавать группы и т.д. Все работает. НО!
Мне необходимо хранить эту структуру в файле, чтобы потом можно было загрузить ее в редактор. И вот с этим есть определенные сложности. Для дампа использую pickle. Но pickle не поддерживает дамп объектов QStandardItem, коими пока что являются мои сцены и группы. Для этого, я создал атрибут в классе Project, который по сути является словарем. И вот тут я никак не могу реализовать правильный обход этого словаря таким образом, чтобы на его основе QTreeView правильно выстраивал все сцены и группы. У меня получается либо “поверхностное” построение, то есть правильно выстраиваются только “верхние” элементы (корень может содержать группы и сцены, группа может содержать так же другие группы и сцены, сцена не может содержать ничего), а вложенные элементы не затрагиваются, либо у меня получается бесконечная рекурсия и вылет программы.
Подскажите, пожалуйста, какие могут быть решения для моей ситуации? Пятый день туплю над этим вопросом и голова уже кругом. Нужен взгляд со стороны.
Из вариантов решения, которые я нашел, есть:
- Использование вместо QTreeView QTreeWidget. С ним еще не разбирался, только вот час, как подумал об этом
- Вычитал, что можно в классе QStandardItem определить методы __getstate__() и __setstate__(), чтобы разрешить pickle дампить и загружать эти экземпляры, но не понял, как это реализовать
- Возможно, есть иные способы сериализации объектов. Если такие есть, подскажите, куда копать, пожалуйста
- Возможно, это вообще как-то по-другому делается? Тогда как?
Очень прошу помощи. Какая еще информация от меня нужна?