Заранее спасибо всем тем, кто тему открыл.
Честно говоря, английские доки курить уже сил нет, запутался
Вопрос вот в чем: мне нужно отобразить несложное дерево. Изначально оно генерируется и хранится в написанном мною классе SimpeTree.
Каждый элемент имеет указатель на первого потомка и на соседа (брата) - nextSibling. Алгоритм обхода, заполнение данными, все реализовано.
Всю эту бодягу надо прикрутить к QAbstractItemModel и показать в QTreeView. Подскажите, пожалуйста, с чего начать и как все это сделать.
Спасибо, утром со свежей головой нашел простое решение, посмотрев мануал на QStandardItemModel.
))) Наш человек )))
Правда, остался еще один концептуальный вопрос.
Программа разделена на несколько классов - мой абстрактный BaseTree с реализацией основных функций дерева, SimpleTree, приспособленный уже под более конкретную задачу и TreeDataRepresentation, который фактически загоняет информацию из моей структуры данных (из SimpleTree) в QStandardItemModel.
В BaseTree каждый элемент дерева может представлять из себя все, что угодно, но у меня для простоты пока каждый содержит имя (name) и значение (value), оба типа std::string. Имена выводятся TreeDataRepresentation'ом в QStandardItemModel и после показываются в QTreeView. Все работает, с этим я разобрался.
Как прикрутить сигнал к слоту когда выбирается какой-то элемент, я тоже представляю, но проблема в том, что я не понимаю, как мне достать значение выбранного элемента из BaseTree (а иначе, где их еще хранить?)? Т.е. как связать 2 абстракции?
раз уж ты взялся писать на Qt'ях, то и пользуйся Qt'явыми штучками. Вместо std::string, QString. зачем тебе две модели (SimpleTree и QStandardItemModel) Пользуйся сразу QStandardItemModel, или сделай от нее наследника.
Вопрос: откуда берутся данные?
Автору темы:
интересно, какую версию Qt Вы используете?
Litkevich Yuriy:
Дело в том, что я написал абстрактный класс дерева с минимальной функциональностью, чтобы потом его можно было использовать в других программах.
В том-то все и дело, что меня хочется чтобы данные были максимально обособлены. Сейчас они генерируются псевдослучайным образом. Потом может быть иначе.
icore2008:
Qt 4.4.0 opensource edition.
ЗЫ. Я так понял, что, как и посоветовал Litkevich Yuriy, надо сделать наследника QStandardItem и добавить ему пару нужных мне свойств. Потом, при выборе какого-либо элемента, просто получать по индексу этот элемент и доставать из него дополнительные свойства.
Спасибо
Гость_Гость_*, тыб зарегестрировался, а то к тебе обращатся проблематично.
Абстрагирование данных от их представлений реализуется концепцией модель/представление, а реализовать подобную концепцию независимой от библиотеки (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'шные средства.
Возникла потребность всё же сделать дерево в таблице, причём модель наследуется от QAbstractItemModel (т.к. приходится делать собственную ленивую загрузку, и данных может быть ооочень много, поэтому грузить их всех - использовать QStandardItemModel не представляется возможным).
переопределил index, parent, insertRows, rowCount, columnCount, data, headerData
При добавлении элементов вызываю beginInsertRows, endInsertRows.
есть элементы вложенные, НО!
отображается только один дочерний элемент и нет рядом значков ни + ни - (т.е если у него дети или нет, хотя при построении они есть, и при добавлении index'ы тоже корректно создаются).
кто может подсказать где проблема может быть
Вопрос снят: почему-то использовал QTableView вместо QTreeView
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)