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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTreeView и база данных  (Прочитано 16677 раз)
crocus
Гость
« : Май 27, 2008, 05:25 »

Перечитал все, что в гугеле нарыл, них..ра не врублюсь!
Обычная табличка -- ID, parent_ID, level, нужно представить данные в виде дерева.
Не догоняю главного -- что нужно скормить QStandartItemModel (каким должен быть запрос), чтобы начать строить tree.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Май 27, 2008, 08:28 »

Если у тебя Представление должно отображать данные из БД то QStandartItemModel не лучший выбор, лучше взять QSqlQueryModel, но по умолчанию она только для чтения, если еще и писать в БД нужно, то прийдется от нее наследника сделать.
Записан

Юра.
ритт
Гость
« Ответ #2 : Май 27, 2008, 08:44 »

Код:
	QString sSql = QString("SELECT id, name FROM elements WHERE parent_id IS NULL OR parent_id=0 ORDER BY name ASC");
QSqlQuery parentsQuery;
if(!parentsQuery.exec(sSql))
return;

while(parentsQuery.next())
{
int parentId = parentsQuery.value(0).toInt();
QString parentName = parentsQuery.value(1).toString();

QTreeWidgetItem* parentItem = new QTreeWidgetItem(someTreeWidget, QStringList(parentName));
parentItem->setData(0, Qt::UserRole + 1, parentId);
someTreeWidget->addTopLevelItem(parentItem); // вероятно, можно удалить, т.к. в теории QTreeWidgetItem(someTreeWidget, ...) сделает ноду топовой
{
sSql = QString("SELECT id, name FROM elements WHERE parent_id=%1 ORDER BY name ASC").arg(parentId);
QSqlQuery childrenQuery;
if(childrenQuery.exec(sSql))
{
while(childrenQuery.next())
{
int childId = childrenQuery.value(0).toInt();
QString childName = childrenQuery.value(1).toString();

QTreeWidgetItem* childItem = new QTreeWidgetItem(parentItem, QStringList(childName));
childItem->setData(0, Qt::UserRole + 1, childId);
}
}
}
}
т.к. данных у тебя предполагается много, лучше запросы заменить на кверимодель

это, соответственно, для таблички вида
Цитировать
CREATE TABLE  `elements` (
  `id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) NOT NULL default '0',
  `name` varchar(255) NOT NULL,
  PRIMARY KEY  (`ID`),
  KEY `ix_element_1` (`parent_id`),
);

но я ещё раз советую разбить таблицу на две: ид=>данные и ид=>родитель...а код выше использовать как базовый пример для построения сложной модели )
Записан
Alex03
Гость
« Ответ #3 : Май 27, 2008, 11:18 »

..........
но я ещё раз советую разбить таблицу на две: ид=>данные и ид=>родитель...а код выше использовать как базовый пример для построения сложной модели )
Константин в посте crocus-а не было ни слова про мастер-деталь (или 2-х уровневость). А в дереве может быть много уровней - табличек не напасёшься...
Кстати в Вашем примере запросы по всей видимости выполняются в разных транзакциях, что не есть гут.

crocus. Если данных не много и надо их все выгрести на клиента, то можно одним циклом на подобие того что привёл Константин.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Май 27, 2008, 12:16 »

Подобные темы уже были. Юзаем поиск.

http://prog.org.ru/forum/index.php/topic,4659.0.html
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #5 : Май 27, 2008, 12:40 »

> в посте crocus-а не было ни слова про 2-х уровневость...
Алекс03, я знаю о чём говорю
Записан
ритт
Гость
« Ответ #6 : Май 27, 2008, 12:44 »

> А в дереве может быть много уровней - табличек не напасёшься...
хватит двух
Записан
Alex03
Гость
« Ответ #7 : Май 27, 2008, 14:04 »

> А в дереве может быть много уровней - табличек не напасёшься...
хватит двух
С тем же успехом можно сказать что хватит одной таблицы. Улыбающийся
Записан
crocus
Гость
« Ответ #8 : Май 27, 2008, 16:01 »

Всем спасибо, разбираюсь..
Поиск рулит. Видимо глаз замылился.
Записан
Вячеслав
Гость
« Ответ #9 : Май 27, 2008, 18:04 »

но я ещё раз советую разбить таблицу на две: ид=>данные и ид=>родитель...а код выше использовать как базовый пример для построения сложной модели )

а можно pro-аргументы за такое чудо ?
contra - 1) лишние индексы (и pk и fk)
2) лишние join'ы при выборке данных
3) в некоторых случаях много _мелких_ записей может серьезно замедлить сервер (mysql и fb меньше  слоник)
Ы ?
Записан
ритт
Гость
« Ответ #10 : Май 27, 2008, 21:28 »

> mysql и fb меньше  слоник
ну ты и выражаешься Улыбающийся поди-разбери теперь что это должно означать

крокусу нужна категоризация элементов с родительско-дочерней зависимостью
сейчас у него всё в одной таблице и строки при необходимости дублируются, если родителей/детей больше одного
Записан
White Owl
Гость
« Ответ #11 : Май 27, 2008, 23:11 »

крокусу нужна категоризация элементов с родительско-дочерней зависимостью
сейчас у него всё в одной таблице и строки при необходимости дублируются, если родителей/детей больше одного
А он вообще-то не говорил что родителей может быть больше одного. Для дерева с одним родителем вполне хватает одной таблицы, для множественных родителей - двух таблиц. Количество детей всегда подразумевается больше одного.
Записан
Sergeich
Гость
« Ответ #12 : Май 28, 2008, 01:25 »

 Если родителей может быть больше одного, то это уже не дерево, а граф  Смеющийся И как его отображать вообще хер поймешь Веселый
Записан
Вячеслав
Гость
« Ответ #13 : Май 28, 2008, 07:59 »

> mysql и fb меньше  слоник
ну ты и выражаешься Улыбающийся поди-разбери теперь что это должно означать

крокусу нужна категоризация элементов с родительско-дочерней зависимостью
сейчас у него всё в одной таблице и строки при необходимости дублируются, если родителей/детей больше одного
Попиши акты после разборок со смежниками на тему кто дурак и что теперь делать - еще не так будешь выражаться Подмигивающий
Имелось ввиду (сам наблюдал) что птиц (и intrbase) и mySql при 17-18млн очень мелких записей - (там было 3 поля дата,код датчика,значение) начинали дико тормозимть при выборке по дате.... Для птица это в теории можно было бы объясниить сборкой мусора - но  mySql не версионник , так-что непонятно .... да, птиц был 2.0x какой-то 2.1 тогда еще небыло .... народ попытался уползти на слонника(postgress) но там грабли начались с 50млн с падением в кору(вроде уже пофикисли ,но опять-таки щаз не смотрели ж) Теперь маленькая версия этой проги живет на Линтере\Sybase ASA большая  на "кластерном дятле" (Оракле)......
А для дерева (не графа) для баз этож вроде классика id,parent_id,(данные )+ => строим отношение один-ко многим (один родитель много детей) ......
Записан
Tonal
Гость
« Ответ #14 : Июнь 05, 2008, 22:08 »

2 Вячеслав
Можешь привести структуру таблички, пример данных и тормозящие запросы для птица?
Или ссылку на обсуждение этого момента?
Можно в личку, чтоб не захламлять форум.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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