LINUX.ORG.RU

Хранилище данных и модель

 ,


0

1

«При реализации модели следует помнить, что QAbstractItemModel не хранит данных, он лишь предоставляет интерфейс, используемый представлениями для доступа к данным», — из тутора по QT-моделям.

Что представляет из себя хранилище? И как сие применять на практике?

Может быть, уважаемое сообщество, накидает годных примеров отношений «хранилище-модель», чтобы глубже понять проблему?


Самое простое хранилище это тот-же QList, посмотри в качестве примера в исходниках реализацию QStringListModel.

BRE ★★
()
Ответ на: комментарий от BRE

Или в качестве хранилища может выступать база данных, тогда можно посмотреть всякие QSqlTableModel.

BRE ★★
()
Ответ на: комментарий от BRE

Самое простое хранилище это тот-же QList, посмотри в качестве примера в исходниках реализацию QStringListModel

Да, но в этих примерах QList хранится в модели, что диссонирует с вышеприведенной цитатой.

h0x0d9
() автор топика

Что представляет из себя хранилище?

что прописано в наследнике QAbstractItemModel то и представляет. Может быть по-сути что угодно - от файловой системы до веб-сервиса. QSqlQueryModel как пример. Посмотри все производные классы от QAbstractItemModel чтобы понять какие модели уже есть готовые, и надо ли тебе писать свою.
Есть например QStandardItemModel - просто хранилище в памяти.

И как сие применять на практике?

унаследовать QAbstractItemModel и переопределить его методы (если нужной тебе модели нету из коробки Qt. Как правило уже все есть)

Суть такая:
Представление (допустим грид) имеет указатель на модель (QAbstractItemModel) и у него спрашивает - какие данные отобразить в ячейке (к примеру) 3,5 (это индекс). Модель отвечает - показать такой-то QVariant. Что именно спрашивает представление - это называется роль (т.е. к примеру текстовая роль - модель возвращает текст, цветовая роль - возвращает цвет, роль шрифта - модель подсказывает какой шрифт - см Qt::ItemDataRole).

Это я не по документации, а чтобы (возможно) было легче въехать. Вообще представляй QAbstractItemModel как интерфейс к таблице, в каждой ячейке которой записаны данные и сопутствующие метаданные к ним. Где это хранится определяет производный класс, QSqlQueryModel например берет данные из запроса к БД.

dib2 ★★★★★
()

да любое хранилище, просто если оно реализует QAbstractItemModel, то к этому хранилищу можно будет сопкойно цеплять контролы.

у тебя вообще может быть какойнить REST апи спрятан под капотом.

VladimirMalyk ★★★★★
()
Ответ на: комментарий от VladimirMalyk

Я знаю, ТС хотел посмотреть пример модели, которая не хранит в себе данные - прокси-модель одна из таких.

BRE ★★
()
Ответ на: комментарий от h0x0d9

Забей, если тебе доступ к хранилищу нет необходимости организовывать через разные модели, то можешь хранить данные внутри модели.

trex6 ★★★★★
()

QAbstractItemModel - это абстрактный класс. Воспринимай это как интерфейс (класс-интерфейс), который предоставляет только сам доступ к данным. Сам QAbstractItemModel не имеет никаких встроенных структур для хранения - никаких списков, векторов, указателей на реализацию етц. Вот что имеется в виду.

Для создания своей модели ты унаследуешь этот абстрактный класс. Фактически, ты сделаешь свой класс с наперёд заданным интерфейсом. MVC-паттерн отвечает за предоставление тебе унифицированного интерфейса. А за хранение данных отвечаешь ты и только ты. Хоть в этом своём классе в приватной секции в том же списке, хоть в глобальном объекте, хоть где-то в сети или БД и доставать/класть данные только в методах-геттерах типа cell(). Можно даже вычислять по запросу. Полуркай примеры в документации. И подучи ООП.

E ★★★
()
Ответ на: комментарий от h0x0d9

Да, но в этих примерах QList хранится в модели, что диссонирует с вышеприведенной цитатой.

Совсем нет. В доках говорится ровно то, что QAbstractItemModel не хранит внутри себя данные модели. Но это абстрактный класс, реализующий базовый функционал. Его наследники как раз должны содержать сами данные или извлекать их из какого-то внешнего источника.

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 3)

Что представляет из себя хранилище?

Да любые данные. Модель осуществляет связь между твоими кастомными данными и стандартныи контролами QTreeView,QTableView,QListView.

pathfinder ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.