Название: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: xintrea от Январь 22, 2009, 00:50 Здравствуйте!
Вот пишу я, пишу прогу. В основе лежит пример /examples/itemviews/editabletreemodel. И такой уродливый код приходится писать... А все потому, что при работе с древовидными данными мне часто требуется две вещи: 1. Получить по известному QModelIndex указатель на TreeItem 2. Получить по известному указателю на TreeItem значение QModelIndex Первая вещь реализуется легко - преобразование можно сделать через метод модели getItem() Код: TreeItem *TreeModel::getItem(const QModelIndex &index) const А вот как сделать вторую вещь, я теряюсь в догадках. Есть мысля хранить QModelIndex в каждом TreeItem элементе. Но это неправильно, ибо QModelIndex динамически меняется, и в доке сказано, что хранить эти данные бессмысленно. Кроме того, усложняется инициализация нового TreeItem элемента, да и вообще, инициализация дерева модели начинает зависеть от вида, что не есть правильно. Есть еще мысля делать поиск по виду, получая из QModelIndex каждой ветки TreeItem, и сравнивая его с искомым указателем. Это более реально, проблема только в получении внутри модели значения QModelIndex для корневого элемента вида. Но это значение можно передавать извне как параметр, ибо извне, зная ссылку на вид, получить QModelIndex первого элемента вида легко. Недостаток - поиск зависит от размера дерева, что при большом дереве приведет к достаточно медленному процессу получения QModelIndex из TreeItem. Вопрос - как сделать наиболее правильно? А может быть, эта задача решается в две строчки, а я не знаю как? Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: Dendy от Январь 22, 2009, 01:35 Хочется узнать, в каком именно случае вам потребовалось такое преобразование?
Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: vaprele07 от Январь 22, 2009, 04:21 createIndex!
Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: xintrea от Январь 22, 2009, 08:26 Хочется узнать, в каком именно случае вам потребовалось такое преобразование? Например, для восстановления состояния программы, чтобы выбирать ветку дерева, с которой была работа при последнем закрытии программы. Дерево хранится в XML. При старте программы оно раскладывается по элементам TreeItem. Элементы TreeItem, помимо названия веток дерева, ссылок на родителя и списка ссылок на потомков, хранят и другие данные. В частности, id ветки (хранится в XML, уникальный для каждой ветки). При закрытии программы, в конфиг сохраняется строка пути до рабочей ветки в виде перечисленных id. При старте программы, эта строка считывается. В терминах TreeItem легко находится нужный TreeItem (т.к. в TreeItem хранится id). После этого, надо курсор поставить на ветку, соответсвующую нужному TreeItem. Вот тут и требуется преобразование TreeItem в QModelIndex. Еще удобно такое преоразование делать при операциях вставки/удаления элементов дерева, когда в конце процедуры нужно установить курсор на нужный TreeItem. Обычно, при вставке/удалении веток, TreeItem и его соседи известны. А для того чтобы в конце установить курсор куда нужно, приходится синхронно делать действия с TreeItem и QModelIndex. Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: xintrea от Январь 22, 2009, 08:56 createIndex! Не догоняю я, как этим createIndex() пользоваться. Пробую так Код: QModelIndex knowtreemodel::get_item_index(TreeItem *item) И так Код: return this->createIndex(itemrow,0,item->parent()); получаю сегфолт при попытке воспользоваться (установить курсор) на сгенерированный QModelIndex. Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: ритт от Январь 22, 2009, 09:04 QAbstractItemModel::createIndex ?:)
а который из них используется для QAbstractItemModel::createIndex(itemrow,0,item->parent()); ? Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: xintrea от Январь 22, 2009, 09:55 QAbstractItemModel::createIndex ?:) а который из них используется для QAbstractItemModel::createIndex(itemrow,0,item->parent()); ? Не понял вопроса. knowtreemodel - естественно, унаследован от QAbstractItemModel. Посему return this->createIndex(itemrow,0,item->parent()); как бе должно работать, но не работает. В доке описание краткое, понять как пользоваца createIndex() сложно. Кароче, сделал через поиск. Может быть и медленно, зато работает. Причем, "проблема только в получении внутри модели значения QModelIndex для корневого элемента. Но это значение можно передавать извне" - это я уже ступил... ничего извне передавать не надо. Код http://paste.org.ru/?cagbcf (http://paste.org.ru/?cagbcf) (75 строк). Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: vaprele07 от Январь 22, 2009, 10:06 не item->parent() а... createIndex(itemrow, 0, item);
Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: xintrea от Январь 22, 2009, 11:23 не item->parent() а... createIndex(itemrow, 0, item); Во, спасиба, так заработало, зря перебор дерева писал. Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: ритт от Январь 22, 2009, 12:04 > Не понял вопроса...
я к тому, что там штуки четыре этих createIndex, и, не зная что отдаёт item->parent(), можно лишь догадываться какой из них используется и в чём причина сегфолта...вапреле угадал :) Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: Setner от Январь 26, 2013, 09:24 Вопрос снят
Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: Bepec от Январь 26, 2013, 09:30 Потому что на каждый новый вопрос нужно создавать новую тему. А так же описать что вы вообще хотите сделать )
PS ваш КО. Название: Re: Работа с деревом QTreeView. Из QModelIndex получить TreeItem легко. А наоборот? Отправлено: Setner от Январь 26, 2013, 09:34 Ладно, буду знать на будущее.
Если можно, удалите последние сообщения здесь. |