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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поиск в пользовательской иерархической модели (на основе edittabletreemoldel)  (Прочитано 2805 раз)
lexaaleynik
Гость
« : Июль 27, 2016, 12:55 »

Необходимо реализовать пользовательскую модель дерева. Открыл edittabletreemoldel example из SDK (Examples/itemviews/editabletreemodel). Не разобрался. Непонимающий
Там кроме класса самой модели реализован ещё класс узлов, объекты которого используются в реализации класса модели.

Если отбросить в сторону изначальную инициализацию модели данными из файла с помощью метода setupModelData(const QStringList &lines, TreeItem *parent), то добавление строк и строк-потомков осуществляется двумя соответствующими слотами: insertRow(), insertChild() и в данном примере эти слоты получают индексы родительского узла модели куда именно надо добавить строку (или строку потомка) из метода currentIndex() модели вытащенной из представления.

Мне же надо инициализировать свою модель не выбирая родительские узлы по кликам мышки, а анализируя другую модель по некоторому алгоритму в цикле. Прежде всего нужен метод возвращающий QModelIndex узла, в который вставлять строку.
Методы index() и parent() возвращающие индекс узла и его родителя реализованы в классе модели TreeModel. Но бизнес-дата храниться в объекте rootItem (то есть в объекте класса treeItem), а он уже не имеет никаких индексов. И в примере из SDK я не понимаю как найдя айтим получить его индекс.

Поиск айтимов в модели по данным реализован в QStandartItemModel. Аналогичный метод накатал и я:
Код:
QList<TreeItem *> TreeModel::findItems(QString dataColumn, int column)
{
    TreeItem item = rootItem;
    QList<TreeItem *> items;
    for(int i = 0; i < item.childCount(); i++) {
        if(item.child(i)->data(column) == dataColumn)
            items.append(item.child(i));
    }
    return items;
}

Как по найденному айтиму получать QModelIndex(). Вообще я с этим экзамплом не разобрался. Чтение документации не помогла. Где бы мне почитать как подобные модели деревьев реализуются и работают?
Записан
Bepec
Гость
« Ответ #1 : Июль 27, 2016, 13:03 »

Ей богу, напишите что вы имеете в начале и что хотите получить в конце.
Записан
lexaaleynik
Гость
« Ответ #2 : Июль 27, 2016, 13:15 »

Как по найденому item получить индекс узла?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Июль 27, 2016, 13:17 »

Для построения модели дерева: если модель таблицы создавать умеете, то нужно знания дополнить информацией по QAbstractItemModel::index и QAbstractItemModel::parent.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Июль 27, 2016, 13:19 »

Как по найденому item получить индекс узла?
Взять индекс родителя и у него вызвать метод child(row, column). Самый верхнеуровневый индекс это QModelIndex().
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #5 : Июль 27, 2016, 13:25 »

Где бы мне почитать как подобные модели деревьев реализуются и работают?
Вот здесь много полезной информации по работе с моделями (да и не только с ними).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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