Russian Qt Forum

Qt => Базы данных => Тема начата: crossly от Ноябрь 11, 2008, 10:38



Название: QSqlTreeModel всем миром...
Отправлено: crossly от Ноябрь 11, 2008, 10:38
тут было много тем про TreeView и БД.... все же хотелось бы узнать... есть ли у кого нормальный ... допиленый код для работы с этим делом... ??


Название: Re: и снова дерево (дуб)
Отправлено: ритт от Ноябрь 11, 2008, 11:37
мне тоже интересно. пока выбираю запросом данные в стандардмодель и связываю по паренту, но нужна нормальная модель. если у кого-то есть готовая, поделитесь? а то придётся писать свою с нуля :(


Название: Re: и снова дерево (дуб)
Отправлено: Zmeishe от Ноябрь 11, 2008, 12:14
А что значит нормальная ?


Название: Re: и снова дерево (дуб)
Отправлено: ритт от Ноябрь 11, 2008, 12:20
на основе QAbstractItemModel/QSqlQueryModel. желательно бы с возможностью редактирования данных...


Название: Re: и снова дерево (дуб)
Отправлено: Zmeishe от Ноябрь 11, 2008, 12:41
Есть у меня похожая гибрид ужа с ежом. Не айс, но некуда деваться.

SQL вытаскивает верхний уровень и сбрасывает в StandardModel, а в root пишу указатель на SQL model c UserRole+1
Потом ловлю сигнал RowChanged динамически на лету создаю очередную SQL model вытаскиваю следующий уровень и "нахомячиваю"  в standard. Указатель на эту новую sql model опять в текущую row с UserRole+1

Когда надо редактировать показываю диалог с вьюхой, из текущей строки вытаскиваю
указатель на sql model и во вьюху setModel

Получается QStandardItemModel содержащая указатели на кучу линейных sql моделей.

Ещё Тролли накосячили с сигналом RowChanged. В пределах одного парента он высылается, а если юзер кликнул мышкой в строку с таким же номером в другом паренте, то не высылается.

На стоматопроктологию похоже, но ничего лучше не придумал.


Название: Re: и снова дерево (дуб)
Отправлено: ритт от Ноябрь 11, 2008, 13:14
у меня всё проще (достаточно одного прохода для построения дерева), но тоже не айс - я вообще отдаю предпочтение индекс-бэйзед моделям, а в стандардмоделе ещё и с ролями косяк - она предназначена для всяких комбобоксов, а для своих целей приходится делать доп.проверку чтобы выяснить в какой роли на самом деле хранятся edit, а в какой display...

зы. crossly, переименуй ветку нормально


Название: Re: и снова дерево (дуб)
Отправлено: Zmeishe от Ноябрь 11, 2008, 13:27
у меня всё проще (достаточно одного прохода для построения дерева)

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

Оно может быть большим, а юзеру надо пару веток поправить. Я ему первый уровень вывел по умолчанию. Потом он может навигационным мышетыканьем заниматься и я буду достраивать по мере необходимости.
А может вызвать диалог поиска. Я ему sql`ем вытащу желаемое в небольшом наборе, он выберет конкретную запись, после чего я динамически дострою нужную ветвь и поставлю курсор на  то, что он выбрал.
Так приложение бытрее работает и память не отжирает, но логика сложная.

Хотя в век дешёвых гигабайтов...



Название: Re: и снова дерево (дуб)
Отправлено: ритт от Ноябрь 11, 2008, 13:48
я тоже не говорю о построении дерева "сразу". я сказал про "один проход". fetchMore ещё никто не отменял...
с другой стороны, всегда хочется по-быстрее избавиться от квери и по возможности пользовать кэш...но увы...

диалог поиска уже не относится к вопросу о модели, но я бы сделал чуть иначе: отдельным запросом можно найти необходимую строку, а из неё уже узнать родителя и уровень вложенности и по этим данным звать fetchMore для определённой ветки, если необходимо...
в целом это даст возможность искать данные и непосредственно в модели без значительных потерь производительности и дополнительных запросов и/или инструментов.


Название: Re: и снова дерево (дуб)
Отправлено: Zmeishe от Ноябрь 11, 2008, 13:55
но я бы сделал чуть иначе: отдельным запросом можно найти необходимую строку, а из неё уже узнать родителя и уровень вложенности

Именно так и сделано.


Название: Re: и снова дерево (дуб)
Отправлено: ритт от Ноябрь 11, 2008, 14:01
значит, не совсем правильно понял

может перенесёшь свою модель на склкверимодель и выложишь всем на радость? :)


Название: Re: и снова дерево (дуб)
Отправлено: Zmeishe от Ноябрь 11, 2008, 14:11
На склкверимодель точно не перенесу - я не работал с ней ни разу.
У меня своя QSocketModel наследник от QAbstractItemModel для работы по трёхзвенке, а на сервере приложений тоже склкверимодель не юзаю - там прямой API Interbase/Firebird заюзал.

Попробую, по возможности, сделать какую-нибудь выжимку.


Название: Re: и снова дерево (дуб)
Отправлено: ритт от Ноябрь 11, 2008, 14:18
ну, хотя бы на QAbstractItemModel с использованием QSqlQuery в качестве источника данных? а там уже можно будет и под себя допилить при необходимости...
в любом случае, с нуля будет дольше и придётся сталкиваться с теми же проблемами, что другие уже победили в своих реализациях.


Название: Re: QSqlTreeModel всем миром...
Отправлено: ритт от Ноябрь 12, 2008, 09:44
мужики, совсем не в тему ведь! перенесите свои комменты в соответствующий тред, хорошо?


Название: Re: QSqlTreeModel всем миром...
Отправлено: crossly от Ноябрь 12, 2008, 09:59
мдя.... я так понимаю что никто так и не допилил.... лана придётся и дальше пользоватся поделками из standarditemmodel... по не найдется лишнего времени... :(


Название: Re: QSqlTreeModel всем миром...
Отправлено: ритт от Ноябрь 12, 2008, 10:21
лучше помоги пинать Zmeishe - я так понял, что у него часто случаются излишки свободного времени :)
можно пива ему пообещать ;)


Название: Re: QSqlTreeModel всем миром...
Отправлено: crossly от Ноябрь 12, 2008, 14:02
товарищ Zmeishe !!... сделай доброе дело для сообщества... !! :) (пиво прилогается...)


Название: Re: QSqlTreeModel всем миром...
Отправлено: Zmeishe от Ноябрь 12, 2008, 16:27
Излишков свободного времени у меня нет совсем, поэтому пинать бесполезно.
То, что у меня быстро получается, чего у других медленно получается - ну извините не моя вина.
Может у меня мозги на другой частоте работают ?  ;)

С сообществом поделюсь.
Предлагаю так же, как с многоуровневыми заголовками - делаю выжимку и выкладываю, а дальше вопрос-ответ, т.к. нет времени подробные комментарии расписывать в исходниках.

>> можно пива ему пообещать
- Барыня, водочку пить будешь?
- Ах, оставьте.
;D


Название: Re: QSqlTreeModel всем миром...
Отправлено: Sergeich от Ноябрь 16, 2008, 15:40
Я же уже вроде постил редактируемую tree-модель с кэшем, основанную на QAbstractItemModel, правда для одной таблицы. Хотя не помню, что за вариант выкладывал. Вобщем, см. аттач.


Название: Re: QSqlTreeModel всем миром...
Отправлено: Karl-Philipp от Январь 08, 2009, 22:47
спасибо за модель.

Только вот никак не пойму, какой должна быть структура таблицы? Пробовал сделать так:
Код:
"CREATE TABLE Object (id INTEGER PRIMARY KEY, parentName INTEGER, value1 INTEGER, value2 INTEGER)"
Базу конектит, таблицу видит, а данные не выводит. Подскажите, пожалуйста, что я мог не так сделать?


Название: Re: QSqlTreeModel всем миром...
Отправлено: lit-uriy от Январь 08, 2009, 23:10
2 terlan, может внешний ключ надо на родителя?


Название: Re: QSqlTreeModel всем миром...
Отправлено: Karl-Philipp от Январь 08, 2009, 23:26
Сделал так (добавил внешний ключ на родителя):
           
Цитировать
QSqlQuery query;
   query.exec("CREATE TABLE Object (id INTEGER PRIMARY KEY, parentName INTEGER  FOREIGN KEY, value1 INTEGER, value2 INTEGER)");

   query.exec("insert into Object values(NULL,1,1,0)");
   query.exec("insert into Object values(NULL,1,3,0)");
   query.exec("insert into Object values(NULL,1,5,0)");
   query.exec("insert into Object values(NULL,2,2,0)");
   query.exec("insert into Object values(NULL,2,3,0)");

перестала заполняться таблица :(
Разве не могут внешние ключи для нескольких записей быть одинаковыми?


Название: Re: QSqlTreeModel всем миром...
Отправлено: lit-uriy от Январь 09, 2009, 00:41
Могут, а вот NULL в первичном ключе это зачем?


Название: Re: QSqlTreeModel всем миром...
Отправлено: lit-uriy от Январь 09, 2009, 00:43
и зачем ты это мучаешь через Query, ведь о том пляска с моделью и была, чтобы в представлении ее использовать.
Создай таблицу, к модели прицепи вьюху, и через неё пользуй. Я так идею понимаю.


Название: Re: QSqlTreeModel всем миром...
Отправлено: Karl-Philipp от Январь 09, 2009, 09:34
Могут, а вот NULL в первичном ключе это зачем?
Прочитал такое на сайте SQLITE, раздел FAQ
Цитировать
If you declare a column of a table to be INTEGER PRIMARY KEY, then whenever you insert a NULL into that column of the table, the NULL is automatically converted into an integer which is one greater than the largest value of that column over all other rows in the table, or 1 if the table is empty

и зачем ты это мучаешь через Query, ведь о том пляска с моделью и была, чтобы в представлении ее использовать.
Создай таблицу, к модели прицепи вьюху, и через неё пользуй. Я так идею понимаю.
я не мучаю через Query, просто написал небольшую программку, в которой создал базу с таблицей.
Саму SqlTreeModel не трогал, а просто подсоединяю к ней созданную базу.
Только не отображается таблица. У меня подозрение, что в таблице что-то не так, а вот что ???


Название: Re: QSqlTreeModel всем миром...
Отправлено: lit-uriy от Январь 09, 2009, 11:55
Только не отображается таблица. У меня подозрение, что в таблице что-то не так, а вот что ???
дак посмотри ее с помощью %QTDIR%/demos/sqlbrowser, что там реально записалось


Название: Re: QSqlTreeModel всем миром...
Отправлено: Karl-Philipp от Январь 09, 2009, 12:15
Только не отображается таблица. У меня подозрение, что в таблице что-то не так, а вот что ???
дак посмотри ее с помощью %QTDIR%/demos/sqlbrowser, что там реально записалось
Подозрение касается структуры таблицы в базе - почему то модель (SqlTreemodel) не подгребает данные из созданной мною таблицы.
Ps А данные в таблицу вставляются, правда без FOREIGN KEY

-----------------------
хотя, если судить по коду sqltreemodel, то FOREIGN KEY в данной ситуации для родителя не нужен.


Название: Re: QSqlTreeModel всем миром...
Отправлено: Karl-Philipp от Январь 09, 2009, 23:50
получилось:
ошибки было 2:
1) названия полей не соответствовали тем, что находятся в модели;
2) не была определена ниодна запись с родительским уровнем 0, то есть даже для первого элемента уже был указан родитель первого уровня.

Т.о.
1) создаем таблицу
Цитировать
CREATE TABLE Object (ObjID INTEGER PRIMARY KEY, ParentID INTEGER, ObjName TEXT, ObjType TEXT, Created TEXT);
2) создаем записи:
Цитировать
   QSqlQuery query;
   query.exec("insert into Object values(NULL,0,'Object1','Some type', 'yes')");
   query.exec("insert into Object values(NULL,1,'Object2','Some type', 'yes')");
   query.exec("insert into Object values(NULL,1,'Object3','Some type', 'yes')");
Зы: спасибо Константину за наводки :)


Название: Re: QSqlTreeModel всем миром...
Отправлено: vpara от Июль 29, 2010, 14:49
Я же уже вроде постил редактируемую tree-модель с кэшем, основанную на QAbstractItemModel, правда для одной таблицы. Хотя не помню, что за вариант выкладывал. Вобщем, см. аттач.

По вашему примеру я сделал себе трее только с выбором из 2 таблиц (структура на рисунке) ...
А дальше возникли 2 вопроса:
 1. Хочу сделать выборку еще из 2 таблиц (итого будут 4 ... структура в рисунке2) ... что посоветуете сделать в те же запросы или создавать новые ниже
 2. Как установить иконки для итемов? (пока не разобрался .... но сильно не капал)


Название: Re: QSqlTreeModel всем миром...
Отправлено: vpara от Июль 29, 2010, 16:10
Я же уже вроде постил редактируемую tree-модель с кэшем, основанную на QAbstractItemModel, правда для одной таблицы. Хотя не помню, что за вариант выкладывал. Вобщем, см. аттач.

Пытаюсь грубо (временно) дописать запрос ... по идее должен быть как то так:

       query.exec( QString("SELECT %1 FROM %2, %3 WHERE %4 = %5 AND %6 = %7 "
                        "UNION ALL "
                        "SELECT product.product_id FROM product, product_category_xref "
                        "WHERE product.product_id = product_category_xref.product_id AND category_id = %5")
                .arg(idName)
      .arg(tableName)
                .arg(tableRelated)
      .arg(parentName)
      .arg(id)
                .arg(idName)
                .arg(relatedId)
                .arg(orderByField));

Но результат не радует ...


Название: QyurSqlTreeView
Отправлено: irv от Май 15, 2012, 12:40
Я скачал проект QyurSqlTreeView с qt-apps.org, но возникли проблемы.

Собрал пример (sqltreesample), подключил к своей БД и все успешно работает.
Добавил новую форму через QtCreator и компонент tableview и treeview.
Подключил загоолвочный файл qyursqltreeview.h и добавил код:

Код:
QyurSqlTreeModel model("treetable",QStringList()<<QObject::tr("Id")<<QObject::tr("ParentId")<<QObject::tr("Type")<<QObject::tr("Title")<<QObject::tr("Summary"),QStringList()<<"id"<<"parentId"<<"type"<<"title"<<"summary",-1,"title");

ui.tableView.setModel(model.sourceModel());


В таблице tableView ничего не отображается.

Вопрос простой.
Как соединить компоненты tableview и treeview добавленные через QtDesigner c QyurSqlTreeModel.
Где я ошибся?

Спасибо.


Название: Re: QSqlTreeModel всем миром...
Отправлено: revolvers от Сентябрь 25, 2012, 12:52
Mojete vilojit peredelanniy primer s viborkoy iz dvux tablits?
Я же уже вроде постил редактируемую tree-модель с кэшем, основанную на QAbstractItemModel, правда для одной таблицы. Хотя не помню, что за вариант выкладывал. Вобщем, см. аттач.

По вашему примеру я сделал себе трее только с выбором из 2 таблиц (структура на рисунке) ...
А дальше возникли 2 вопроса:
 1. Хочу сделать выборку еще из 2 таблиц (итого будут 4 ... структура в рисунке2) ... что посоветуете сделать в те же запросы или создавать новые ниже
 2. Как установить иконки для итемов? (пока не разобрался .... но сильно не капал)


Название: Re: QSqlTreeModel всем миром...
Отправлено: RVZ от Ноябрь 05, 2012, 00:04
А мой вариант модели дерева на двух столбцах одной таблицы (без класса элемента) тут http://www.prog.org.ru/topic_21981_0.html  :P
Вот так сказать свои три копейки в общее дело  ::) а то такая тема и без моего поста  ;D непорядок ...

P.S. ну и что что несколько раз перебирается зато пнул и поехало...


Название: Re: QSqlTreeModel всем миром...
Отправлено: sergek от Ноябрь 10, 2012, 19:25
К сожалению, не обратил внимание на древнюю дату топика, вырезал из разрабатываемого проекта свой пример. Теперь жалко выбрасывать. Раз тема всплыла, может, кому пригодится.

В примере решается задача хранения текстовых данных (скриптов) в иерархическом хранилище. Две таблицы - папки->скрипты, отношение 1:M. Структура таблиц в файле tables.sql.

За основу взят Editable Tree Model Example из Qt Reference Documentation. Взаимодействие с БД сделано на уровне источника данных (CScriptCollectionItem), внешний интерфейс - в классе модели (CScriptCollectionModel) в виде шести открытых методов и двух слотов.