Russian Qt Forum
Октябрь 01, 2024, 14:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: представление дерева  (Прочитано 4573 раз)
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);
}
}
как добавить итемы к такой модели?
Записан
Larry
Гость
« Ответ #1 : Январь 19, 2011, 17:09 »

как я понимаю здесь должен быть еще один вложенный цикл, где и идет добавление итемов, но пока не могу это реализовать...помогите пожалуйста:)
Записан
developer
Гость
« Ответ #2 : Январь 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

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


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












Записан
Larry
Гость
« Ответ #3 : Январь 23, 2011, 12:03 »

Спасибо большое, но пока я ждал ответа:) разобрался как сделать, теперь работает все без проблем:)
Записан
Fess
Гость
« Ответ #4 : Январь 23, 2011, 13:16 »

Пиши ответ, кому-нибудь обязательно пригодится Улыбающийся
Записан
Larry
Гость
« Ответ #5 : Январь 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);
}
}
}
Записан
Troglodit
Гость
« Ответ #6 : Февраль 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
Записан
Larry
Гость
« Ответ #7 : Февраль 13, 2011, 09:43 »

Troglodit, спасибо за критику!!!Я уже переписал этот бред через QSqlQuery...компактнее Улыбающийся...спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.043 секунд. Запросов: 21.