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.

Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Дмитрий -
  опции профиля:
сообщение 5.8.2011, 12:46
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 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).
Использование кэширования позволяет заполнить модель элементами дерева за один цикл. Правда увеличивается расход памяти на кэширование, но зато сокращается расход памяти и времени на рекурсивный вызов функции.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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


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