Russian Qt Forum

Qt => Вопросы новичков => Тема начата: lexaaleynik от Июль 27, 2016, 12:55



Название: Поиск в пользовательской иерархической модели (на основе edittabletreemoldel)
Отправлено: 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(). Вообще я с этим экзамплом не разобрался. Чтение документации не помогла. Где бы мне почитать как подобные модели деревьев реализуются и работают?


Название: Re: Поиск в пользовательской иерархической модели (на основе edittabletreemoldel)
Отправлено: Bepec от Июль 27, 2016, 13:03
Ей богу, напишите что вы имеете в начале и что хотите получить в конце.


Название: Re: Поиск в пользовательской иерархической модели (на основе edittabletreemoldel)
Отправлено: lexaaleynik от Июль 27, 2016, 13:15
Как по найденому item получить индекс узла?


Название: Re: Поиск в пользовательской иерархической модели (на основе edittabletreemoldel)
Отправлено: __Heaven__ от Июль 27, 2016, 13:17
Для построения модели дерева: если модель таблицы создавать умеете, то нужно знания дополнить информацией по QAbstractItemModel::index и QAbstractItemModel::parent.


Название: Re: Поиск в пользовательской иерархической модели (на основе edittabletreemoldel)
Отправлено: __Heaven__ от Июль 27, 2016, 13:19
Как по найденому item получить индекс узла?
Взять индекс родителя и у него вызвать метод child(row, column). Самый верхнеуровневый индекс это QModelIndex().


Название: Re: Поиск в пользовательской иерархической модели (на основе edittabletreemoldel)
Отправлено: Hellraiser от Июль 27, 2016, 13:25
Где бы мне почитать как подобные модели деревьев реализуются и работают?
Вот здесь (http://www.books.ru/books/qt-professionalnoe-programmirovanie-razrabotka-krossplatformennykh-prilozhenii-na-s-827254/?show=1) много полезной информации по работе с моделями (да и не только с ними).