Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QTreeWidget сохранить


Автор: Maledictus 16.8.2010, 15:22
Необходимо сохранить всю структуру QTreeWidget. Желательно в БД. Каким образом это можно сделать я не понимаю. В google не нашел решения проблемы. xml слабо подходит по причине возможность очень большого дерева и как следствие долгой загрузкой из xml 

Автор: _GRIN_ 16.8.2010, 23:53
Maledictus, может быть не совсем в тему, но ...
при больших объёмах данных лучше использовать QTreeView вместо QTreeWidget. Данные всё время хранить в БД, а с виджетом связвать их через модель - например QSqlTableModel.

Автор: ecspertiza 17.8.2010, 08:13
Например вот

http://www.rsdn.ru/article/db/Hierarchy.xml

но мне больше нравится и всегда использую вот этот вариант

http://web-notes.ru/2005/01/nested_sets/

Автор: SABROG 17.8.2010, 08:19
Для QTreeWidgetItem есть перегруженный оператор у QDataStream. В базе нужно создать таблицу с 3-мя колонками:

Код

Primary Key | Parent | BLOB


Затем пробегаемся рекурсивно по дереву используя QTreeWidgetItemIterator и заполняем таблицу.

Код

0 0 BLOB - итем с ключем 0, с родителем 0. То есть верхний (top level) элемент
1 1 BLOB - аналогично итем с ключем 1, который сам для себя родитель, а значит верхний элемент сестринский 0-лю.
2 0 BLOB - ребенок для итема с ключем 0
3 0 BLOB - второй ребенок для итема с ключем 0
4 2 BLOB - ребенок для итема 2 у которого родитель 0 (0->2->4)
5 2 BLOB - (0->2->5)


То есть это такое дерево:
Код

Parent (0)
    Child (2)
        Child(4)
        Child(5)
    Child (3)
Parent (1)


Через оператор QDataStream & operator<< ( QDataStream & out, const QTreeWidgetItem & item ) сериализуем каждый итем в QByteArray применяя в качестве устройства QBuffer. Как записывать BLOB данные в базу думаю разберешься.
Если в QTreeWidget больше одной колонки, то просто добавь дополнительные BLOB поля.

Автор: Maledictus 18.8.2010, 08:31
Очень благодарен за помощь. Сейчас пробую через модели реализовать это дерево, и через них думаю сериализовать все дерево в QByteArray и запихнуть в базу эту последовательность байтов.
Если есть какие-либо нарекания на предложенный мной способ, прошу озвучить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)