Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 3, 2017 13:54:55

Saigon1983
Зарегистрирован: 2017-04-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по QTreeView или QTreeWidget

Добрый день, господа!
Впервые прошу помощи на форуме 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 дампить и загружать эти экземпляры, но не понял, как это реализовать
- Возможно, есть иные способы сериализации объектов. Если такие есть, подскажите, куда копать, пожалуйста
- Возможно, это вообще как-то по-другому делается? Тогда как?

Очень прошу помощи. Какая еще информация от меня нужна?

Отредактировано Saigon1983 (Апрель 3, 2017 14:06:23)

Офлайн

#2 Апрель 3, 2017 14:31:19

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Вопрос по QTreeView или QTreeWidget

хранить надо не сам QStandardItem, а его данные - item.text(),item.color() и т.д.
QTreeWidget - QTreeView со встроенной моделью, не вижу профита

Saigon1983
Какая еще информация от меня нужна?
код покажи в тэгах code /code

Отредактировано vic57 (Апрель 3, 2017 14:34:06)

Офлайн

#3 Апрель 3, 2017 14:34:19

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Вопрос по QTreeView или QTreeWidget

> Для дампа использую pickle

Зачем? Для хранения данных используй XML. Сериализовать при помощи pickle Q-объекты нельзя от слова совсем.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Апрель 3, 2017 14:42:02

Saigon1983
Зарегистрирован: 2017-04-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по QTreeView или QTreeWidget

vic57
код покажи в тэгах code /code
Боюсь, в тегах это не получится - он разбит на модули. Если только через github вечером.
Rodegast
Для хранения данных используй XML.
Не смотрел еще в эту сторону. Однако, вопрос все равно останется в том, как правильно на основе загруженных данных, будь они хоть словарем, хоть XML, выстроить дерево в QTreeView. Куда копать? Просто не нашел ни одно толкового примера на этот счет

Отредактировано Saigon1983 (Апрель 3, 2017 14:42:27)

Офлайн

#5 Апрель 3, 2017 14:49:21

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Вопрос по QTreeView или QTreeWidget

> Просто не нашел ни одно толкового примера на этот счет

Первая ссылка в гугле: http://stackoverflow.com/questions/8837950/pyqt-xml-to-qtreewidget



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Апрель 3, 2017 15:05:27

Saigon1983
Зарегистрирован: 2017-04-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по QTreeView или QTreeWidget

Rodegast
Первая ссылка в гугле
Спасибо. Я XML не искал, просто. Пойду курить про него.

Тем не менее, если есть еще какие-то предложения - с удовольствием выслушаю!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version