crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

mishabard
  опции профиля:
сообщение 4.8.2011, 12:23
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 13.6.2011
Из: Киев
Пользователь №: 2741

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте!Реализовал дерево из примера EditableTreeModel. Но заполняю его не как в примере (там оно не удобное на мой взгляд), а с помошью рекурсии, так как данные хранятся в базе в виде id,parentid,name. Дело в том что, чтобы их привести к виду как в примере EditableTreeModel. нужно выполнить туже рекурсию, но только на уровне сервера, быстрее кончно будет заполнение, но тоже не то.
Вопрос первый. Хочу избавиться от рекурсии и заполнять ветки и удалять их по нажатию на "+". Можете тыкнуть, куда посмотреть. Не могу понять как это нужно сделать с этой моделью.
Вопрос второй. У меня сейчас в качестве модели связной список, мне чтобы пробежать по модели и найти нужный id, необходимо опять бегать с помошью рекурсии по древовидному списку. Можно как-то пробежаться по всем строкам QTreeView (включая вложенные)?

Может лучше использовать QStandartItemModel? Все списки будут содержать id,parentid,name, и возможно ставить ChekBox напротив name.

Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 5)
explorer85
  опции профиля:
сообщение 4.8.2011, 13:19
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 18.3.2011
Пользователь №: 2517

Спасибо сказали: 0 раз(а)




Репутация:   0  


Хочу избавиться от рекурсии и заполнять ветки и удалять их по нажатию на "+".

я бы смотрел в сторону:
To create models that populate incrementally, you can reimplement fetchMore() and canFetchMore().

если я правильно понял проблему :unsure:

"Ленивое заполнение" это называется
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Дмитрий -
  опции профиля:
сообщение 5.8.2011, 12:46
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 2.8.2011
Пользователь №: 2782

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(mishabard @ 4.8.2011, 13:23) *
Вопрос первый. Хочу избавиться от рекурсии...
Вопрос второй. У меня сейчас в качестве модели связной список, мне чтобы пробежать по модели и найти нужный id, необходимо опять бегать с помошью рекурсии по древовидному списку. Можно как-то пробежаться по всем строкам QTreeView (включая вложенные)?

Для того чтобы избавится от рекурсии я использовал кэширование элементов дерева с помощью QHash. QHash помогает заполнить QStandardItemModel, а после заполнения вы будете иметь хэш-таблицу с помощью которой вы сможете быстро получить доступ к нужному элементу модели:
  sqsCGroups.prepare("SELECT * FROM groups ORDER BY codegroupup");
  sqsCGroups.exec();

  QStandardItemModel *simCGroups = new QStandardItemModel(this);
  register QStandardItem *siParentGroup = simCGroups->invisibleRootItem();
  register QHash<int, QStandardItem *> hCodesGroups;
  register int codegroup, codegroupup, PrevCodeGr = -1, i = -1;
  do
  {
    codegroupup = sqsCGroups.record().value("codegroupup").toInt();
    if (PrevCodeGr != codegroupup)
    {
      PrevCodeGr = codegroupup;
      siParentGroup = hCodesGroups[codegroupup];
      i = -1;
    }
    ++i;
    siParentGroup->setChild(i, 0, new QStandardItem(sqsCGroups.record().value("numbergroup").toString()));
    siParentGroup->setChild(i, 1, new QStandardItem(sqsCGroups.record().value("namegroup").toString()));
    codegroup = sqsCGroups.record().value("codegroup").toInt();
    siParentGroup->child(i, 0)->setData(codegroup);
    hCodesGroups[codegroup] = siParentGroup->child(i, 0);
  } while (sqsCGroups.next());
  simCGroups->item(0, 0)->setEditable(false);
  simCGroups->item(0, 1)->setEditable(false);

  ui->trvGroups->setModel(simCGroups);
codegroup это ваш id, codegroupup - parentid.

ВАЖНОЕ УСЛОВИЕ: результат запроса должен быть упорядочен по parentid (ORDER BY parentid).
Использование кэширования позволяет заполнить модель элементами дерева за один цикл. Правда увеличивается расход памяти на кэширование, но зато сокращается расход памяти и времени на рекурсивный вызов функции.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mishabard
  опции профиля:
сообщение 5.8.2011, 13:49
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 13.6.2011
Из: Киев
Пользователь №: 2741

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Дмитрий - @ 5.8.2011, 12:46) *
Цитата(mishabard @ 4.8.2011, 13:23) *
Вопрос первый. Хочу избавиться от рекурсии...
Вопрос второй. У меня сейчас в качестве модели связной список, мне чтобы пробежать по модели и найти нужный id, необходимо опять бегать с помошью рекурсии по древовидному списку. Можно как-то пробежаться по всем строкам QTreeView (включая вложенные)?

Для того чтобы избавится от рекурсии я использовал кэширование элементов дерева с помощью QHash. QHash помогает заполнить QStandardItemModel, а после заполнения вы будете иметь хэш-таблицу с помощью которой вы сможете быстро получить доступ к нужному элементу модели:
  sqsCGroups.prepare("SELECT * FROM groups ORDER BY codegroupup");
  sqsCGroups.exec();

  QStandardItemModel *simCGroups = new QStandardItemModel(this);
  register QStandardItem *siParentGroup = simCGroups->invisibleRootItem();
  register QHash<int, QStandardItem *> hCodesGroups;
  register int codegroup, codegroupup, PrevCodeGr = -1, i = -1;
  do
  {
    codegroupup = sqsCGroups.record().value("codegroupup").toInt();
    if (PrevCodeGr != codegroupup)
    {
      PrevCodeGr = codegroupup;
      siParentGroup = hCodesGroups[codegroupup];
      i = -1;
    }
    ++i;
    siParentGroup->setChild(i, 0, new QStandardItem(sqsCGroups.record().value("numbergroup").toString()));
    siParentGroup->setChild(i, 1, new QStandardItem(sqsCGroups.record().value("namegroup").toString()));
    codegroup = sqsCGroups.record().value("codegroup").toInt();
    siParentGroup->child(i, 0)->setData(codegroup);
    hCodesGroups[codegroup] = siParentGroup->child(i, 0);
  } while (sqsCGroups.next());
  simCGroups->item(0, 0)->setEditable(false);
  simCGroups->item(0, 1)->setEditable(false);

  ui->trvGroups->setModel(simCGroups);
codegroup это ваш id, codegroupup - parentid.

ВАЖНОЕ УСЛОВИЕ: результат запроса должен быть упорядочен по parentid (ORDER BY parentid).
Использование кэширования позволяет заполнить модель элементами дерева за один цикл. Правда увеличивается расход памяти на кэширование, но зато сокращается расход памяти и времени на рекурсивный вызов функции.


Спасибо! Сейчас попробую разобраться))))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kataklysm
  опции профиля:
сообщение 7.9.2011, 10:01
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 8.7.2010
Пользователь №: 1867

Спасибо сказали: 0 раз(а)




Репутация:   0  


ИМХО. Лучше использовать связку QCache+QAbstractItemModel+QTreeView, и конечно же и использованием структуры(struct).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Дмитрий -
  опции профиля:
сообщение 9.9.2011, 18:50
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 2.8.2011
Пользователь №: 2782

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Kataklysm @ 7.9.2011, 10:01) *
ИМХО. Лучше использовать связку QCache+QAbstractItemModel+QTreeView, и конечно же и использованием структуры(struct).

Как я понял из документации QCache удаляет сами объекты при полном заполнении кэша, тогда здесь это не подойдёт.
Если из QStandartItemModel никакие функции не нужны, тогда использование QAbstractItemModel возможно будет эффективнее.
Про использование структуры не понял, можно поподробнее?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 14.7.2025, 23:37