Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Larry от Январь 19, 2011, 16:03



Название: представление дерева
Отправлено: Larry от Январь 19, 2011, 16:03
Добрый день, форумчане! Появился такая проблема...Я пытаюсь создать модель дерева из таблицы бд...В принципе дерево выводит, но не могу реализовать добавления дочерних итемов...
Код:
void TreeModel::setupModelData(const QString &tableName, TreeItem *parent)
{
        QList<TreeItem*> parents;
    
parents << parent;

QSqlTableModel* modelName = new QSqlTableModel;

modelName->setTable(tableName);
modelName->select();

QString str;

for(int count = 0; count < modelName->rowCount(); count++)
{
str = modelName->record(count).value("name").toString();
TreeItem* item = new TreeItem(str, parents.last());
parents.last()->appendChild(item);
}
}
как добавить итемы к такой модели?


Название: Re: представление дерева
Отправлено: Larry от Январь 19, 2011, 17:09
как я понимаю здесь должен быть еще один вложенный цикл, где и идет добавление итемов, но пока не могу это реализовать...помогите пожалуйста:)


Название: Re: представление дерева
Отправлено: developer от Январь 21, 2011, 20:18
Попробуй все это реализовать так.

Таблица базы данных
id|pid|name| все остальное

Выборка из таблицы - SELECT id, pid from table_name group by pid;
Заполнение виджета - достаточно просто.

Теперь несколлько слов что все это значит.
Пусть у нас есть дерево

id     |   pid   | name
1            0         name1 - эта нода не имеет отца а являеться корнем
2            1         name_parent_is1
3            1         name1_parent_is1
4            3         name2_parent_is3

То-есть у тебя будет дерево
name1  id=1, pid=0
|---name_parent_is1 id=2, pid=1
|---name1_parent_is1 id=3, pid=1
     |----name2_parent_is3    id=4, pid=3

Эта структура позволяэт создавать деревья в базе любой степени вложености, без особенных усилий и обработок.


Заполнение виджета, в питоне сделал двома строчками, в с++ не делал, но не думаю что сложно














Название: Re: представление дерева
Отправлено: Larry от Январь 23, 2011, 12:03
Спасибо большое, но пока я ждал ответа:) разобрался как сделать, теперь работает все без проблем:)


Название: Re: представление дерева
Отправлено: Fess от Январь 23, 2011, 13:16
Пиши ответ, кому-нибудь обязательно пригодится :)


Название: Re: представление дерева
Отправлено: Larry от Январь 28, 2011, 22:29
Пиши ответ, кому-нибудь обязательно пригодится :)
Код:
void TreeModel::setupModelData(const QString &nameDb, TreeItem *parent)
{
connection(nameDb);

QSqlTableModel* modelGenre = new QSqlTableModel();
QSqlTableModel* modelFilm  = new QSqlTableModel();

modelGenre->setTable("genre");
modelGenre->select();

modelFilm->setTable("film");

for(int count_parent = 0; count_parent < modelGenre->rowCount(); count_parent++)
{
QString str = modelGenre->record(count_parent).value("name").toString();
TreeItem* item = new TreeItem(QStringList() << str, parent);
parent->appendChild(item);

modelFilm->setFilter("genre = '" + str + "'");
modelFilm->select();

for(int count_child = 0; count_child < modelFilm->rowCount(); count_child++)
{
TreeItem* child = new TreeItem(QStringList() << modelFilm->record(count_child).value("name").toString(), item);
item->appendChild(child);
}
}
}


Название: Re: представление дерева
Отправлено: Troglodit от Февраль 02, 2011, 18:10
Не пишите, что это решение, а то вдруг кто-то такое напишет. Я думал у меня руки кривые.
Теперь по теме:  Зачем нужны 2 SQLTableModel и двойной цикл + плюс фильтрация в цикле.
Это просто кошмар. Я полный ньюб в qt , но то, что алгоритм убогий (индусский), видно невооруженным глазом. Решение всего этого безобразия очен простое (для деревьев с небольшим количеством элементов ). QSqlQuery ("select ... from view_tree_table inner join item on..."),т.е. 1 запрос вернет вам без всякой фильтрации и прочего бреда то,что вы хотите.
ЗЫ. я сам искал ответ на этот вопрос, один хороший человек подсказал(это не финальный вариант, но гораздо логичней, чем в вашем топике).
http://www.sql.ru/forum/actualthread.aspx?tid=611751 (http://www.sql.ru/forum/actualthread.aspx?tid=611751)


Название: Re: представление дерева
Отправлено: Larry от Февраль 13, 2011, 09:43
Troglodit, спасибо за критику!!!Я уже переписал этот бред через QSqlQuery...компактнее :)...спасибо