![]() |
|
|
![]()
|
|
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Доброе время суток.
Кто знает, в Qt есть технология "Model->View architecture", в которой нужно организовать 3 класса: view, model, item. Я по обучению организовал - работает, но как? (Я как View использовал QTreeView) Как класс модели (или вида) находит дочерние элементы какого-либо элемента, если в классе модели хранится только коренной элемент (объект класса Item), а класс Item ни от кого не наследуется, причём его функции (getChild(), getParent() и так далее) можно переименовывать произвольным образом - всё равно работает! Вопрос в основном из любопытсва, но всё-равно охота узнать. |
|||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 4 Всего: 97 |
KaraKum, посмотрите Model Index.
http://doc.trolltech.com/4.3/model-view-programming.html http://www.crossplatform.ru/documentation/...programming.php — перевод. |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
Я по этому обучению и создал свой вид по типу дерева (как вид использовал QTreeView). Но в этом обучении вроде нет объяснения тому как этот механизм работает. То есть, например, если в виде деререва раскрывать папки, то как тогда вид (или модель) получает информацию о дочерних элементах раскрываемого элемента?
|
|||
|
||||
| powerfox |
|
||||||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 4 Всего: 97 |
![]()
Когда мы определяем свою модель, то мы реализуем функцию index. Которая всё это и обрабатывает. View получает данные, используя именно метод index. Это внутренние методы модели. Главное то, что в интерфейсе (метод index). Это же «служебные» методы. Которые, наверняка, являются скрытыми (private). Суть модели заключается в том, что мы можем хранить данные в любом виде, но при этом реализуем index, который знает, как мы храним данные и передаёт пользователям (view, delegate) элементы, которые они запрашивают по номеру колонки/столбца и родителю элемента. |
||||||
|
|||||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: нет Всего: 1 |
То есть получается так что при инициализации (или добавлении новых) элементов Item, объект класса Model сохраняет внутри себя (или расширяет) массив объектов QModelIndex, каждому из которых автоматически присваивается (в поле void*) указатель на объект класса Item?
Это можно представить как работает, но как, тогда, работает механизм добавления новых Item'ов уже после инициализации, который у меня реализован вот так:
То есть чтобы вставить новый элемент в нужное место в дереве нужно рекурсивно добраться от родитильского элемента вставляемого объекта к вершине всего дереве, но как это происходит, если, опять же, нет жёстко регламентированных функций (в классе CTreeItem) для получения этого родительского объекта? |
|||
|
||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 4 Всего: 97 |
Нет. Это всего лишь класс для доступа к элементам. Главные фонкции, по сути, column(), row(), data(), parent(), child(). Это исключительно ваша функция, не переопределение Qt-й. Нет, вы это делаете так: Стало быть всё остальное реализованов CTreeItem::appendChild(). Вся суть Model-View в том, что у вас есть класс Model, который имеет определённый набор функций. Вот фрагмент кода с KDevelop:
Данные хранятся произвольным образом. В данном случае, в поле revs. Вся суть использования подели состоит в определении date, index, parent, Xcount, которые будут использованы другими классами (представлением (View) и делегатами представления). Они ничего не знают о том, как мы храним данные. Им лишь нужно уметь их получить. Наша же модель знает, как обработать то, что мы храним и передать другим классам данные. Если подытожить, то основная идея в том, что *только* вы знаете, как хранятся элементы и как их добавлять/удалять. Классам же пользователям нужен лишь интерфейс доступа. Посмотрите документация по QAbstractItemModel. |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |