Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QAbstarctItemModel + QTreeView
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
Гость
Заранее спасибо всем тем, кто тему открыл.

Честно говоря, английские доки курить уже сил нет, запутался :)

Вопрос вот в чем: мне нужно отобразить несложное дерево. Изначально оно генерируется и хранится в написанном мною классе SimpeTree.
Каждый элемент имеет указатель на первого потомка и на соседа (брата) - nextSibling. Алгоритм обхода, заполнение данными, все реализовано.

Всю эту бодягу надо прикрутить к QAbstractItemModel и показать в QTreeView. Подскажите, пожалуйста, с чего начать и как все это сделать.
Litkevich Yuriy
Цитата(Гость_Гость_* @ 25.7.2008, 1:33) *
Заранее спасибо всем тем, кто тему открыл.

тему открыл ты

Цитата(Гость_Гость_* @ 25.7.2008, 1:33) *
Честно говоря, английские доки курить уже сил нет, запутался

русские доки кури здесь

а генерировать лучше не в свой класс, а заполнять сразу модель данными, см. пример
там использована QStandardItemModel, но пример простой
Гость
Спасибо, утром со свежей головой нашел простое решение, посмотрев мануал на QStandardItemModel.
ЙаМайскЫйПчОЛ
))) Наш человек )))
Гость
Правда, остался еще один концептуальный вопрос.

Программа разделена на несколько классов - мой абстрактный BaseTree с реализацией основных функций дерева, SimpleTree, приспособленный уже под более конкретную задачу и TreeDataRepresentation, который фактически загоняет информацию из моей структуры данных (из SimpleTree) в QStandardItemModel.

В BaseTree каждый элемент дерева может представлять из себя все, что угодно, но у меня для простоты пока каждый содержит имя (name) и значение (value), оба типа std::string. Имена выводятся TreeDataRepresentation'ом в QStandardItemModel и после показываются в QTreeView. Все работает, с этим я разобрался.

Как прикрутить сигнал к слоту когда выбирается какой-то элемент, я тоже представляю, но проблема в том, что я не понимаю, как мне достать значение выбранного элемента из BaseTree (а иначе, где их еще хранить?)? Т.е. как связать 2 абстракции?
Litkevich Yuriy
раз уж ты взялся писать на Qt'ях, то и пользуйся Qt'явыми штучками. Вместо std::string, QString. зачем тебе две модели (SimpleTree и QStandardItemModel) Пользуйся сразу QStandardItemModel, или сделай от нее наследника.

Вопрос: откуда берутся данные?
icore2008
Автору темы:
интересно, какую версию Qt Вы используете?
Гость
Litkevich Yuriy:

Дело в том, что я написал абстрактный класс дерева с минимальной функциональностью, чтобы потом его можно было использовать в других программах.

В том-то все и дело, что меня хочется чтобы данные были максимально обособлены. Сейчас они генерируются псевдослучайным образом. Потом может быть иначе.

icore2008:
Qt 4.4.0 opensource edition.

ЗЫ. Я так понял, что, как и посоветовал Litkevich Yuriy, надо сделать наследника QStandardItem и добавить ему пару нужных мне свойств. Потом, при выборе какого-либо элемента, просто получать по индексу этот элемент и доставать из него дополнительные свойства.

Спасибо :)
Litkevich Yuriy
Гость_Гость_*, тыб зарегестрировался, а то к тебе обращатся проблематично.
Абстрагирование данных от их представлений реализуется концепцией модель/представление, а реализовать подобную концепцию независимой от библиотеки (Qt, C++ Builder ...) проблематично, лучше сразу определится, например: "Работаю с Qt, и использую их классы"
Тогда не нужен допкласс типа BaseTree
дело в том что данные в модели QStandardItemModel можно отобразить в трех стандартных представлениях QListView, QTableView и QTreeView
...
QStandardItemModel    *model = new QStandardItemModel;
...
QListView    *list = new QListView;
QTableView    *table = new QTableView;
QTreeView    *tree = new QTreeView;
...
list->setModel(model);
table->setModel(model);
tree->setModel(model);


или создать свое собственное представление, например, графическое, с картинками лампочками или как-то еще.
Гость
То, о чем вы написали, Юрий, я уже знаю :) Наверное вы правы, я прислушаюсь к вашему совету - использовать уже готовые Qt'шные средства.
bobdva
Возникла потребность всё же сделать дерево в таблице, причём модель наследуется от QAbstractItemModel (т.к. приходится делать собственную ленивую загрузку, и данных может быть ооочень много, поэтому грузить их всех - использовать QStandardItemModel не представляется возможным).

переопределил index, parent, insertRows, rowCount, columnCount, data, headerData

При добавлении элементов вызываю beginInsertRows, endInsertRows.
есть элементы вложенные, НО!
отображается только один дочерний элемент и нет рядом значков ни + ни - (т.е если у него дети или нет, хотя при построении они есть, и при добавлении index'ы тоже корректно создаются).

кто может подсказать где проблема может быть

Вопрос снят: почему-то использовал QTableView вместо QTreeView
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.