Класс EnginioModel
EnginioModel представляет данные из Enginio как QAbstractListModel. Подробнее...
| Заголовок: | #include <EnginioModel> |
| С момента: | Qt 5.3 |
| Наследует от: | QAbstractListModel |
Свойства
- 1 свойство унаследовано от QObject
Открытые функции
| EnginioModel(QObject *parent = Q_NULLPTR) | |
| ~EnginioModel() | |
| EnginioReply * | append(const QJsonObject &object) |
| EnginioClient * | client() const |
| Enginio::Operation | operation() const |
| QJsonObject | query() |
| EnginioReply * | reload() |
| EnginioReply * | remove(int row) |
| void | setClient(const EnginioClient *client) |
| EnginioReply * | setData(int row, const QVariant &value, const QString &role) |
| EnginioReply * | setData(int row, const QJsonObject &value) |
| void | setOperation(Enginio::Operation operation) |
| void | setQuery(const QJsonObject &query) |
- 4 открытые функции унаследованы от QAbstractListModel
- 39 открытых функций унаследованы от QAbstractItemModel
- 31 открытых функций унаследовано от QObject
Сигналы
| void | clientChanged(EnginioClient *client) |
| void | operationChanged(Enginio::Operation operation) |
| void | queryChanged(const QJsonObject &query) |
- 18 сигналов унаследовано от QAbstractItemModel
- 2 сигнала унаследовано от QObject
Дополнительные унаследованные члены
- 2 открытых слота унаследовано от QAbstractItemModel
- 1 открытый слот унаследован от QObject
- 11 статических открытых членов унаследовано от QObject
- 19 защищенных функций унаследовано от QAbstractItemModel
- 9 защищенных функций унаследовано от QObject
- 1 защищенный слот унаследован от QAbstractItemModel
Подробное описание
EnginioModel представляет данные из Enginio как QAbstractListModel.
EnginioModel — это QAbstractListModel, вместе с представлением позволяет отображать результаты запроса удобным способом. Модель выполняет операции запроса, обновления и создания асинхронно на коллекциях бэкенда Enginio, что позволяет не только читать данные из облака, но и изменять их.
Простейший тип запроса:
{ "objectType": "objects.fruits" } Назначение такого запроса модели приводит к скачиванию всех объектов из коллекции "objects.fruits". Можно добавить новые объекты, изменить или удалить их.
Запрос должен привести к списку объектов, каждый объект становится элементом модели. Свойства элементов используются в качестве имён ролей. Существует несколько предопределённых имён ролей, которые всегда будут доступны (Роль).
Операции выполняются асинхронно, что означает, что интерфейс пользователя не блокируется, пока модель инициализируется и обновляется. Каждое изменение делится на два шага: запрос и подтверждение. Например, когда вызывается append, EnginioModel возвращает немедленно, как будто операция прошла успешно. На заднем плане она ожидает подтверждения от бэкенда, и только после этого операция действительно завершается. Может произойти сбой операции, например, из-за недостаточных прав доступа, в этом случае операция будет отменена.
Есть два способа отследить, совпадает ли состояние элемента в модели и на бэкенде. Каждый элемент имеет роль, которая возвращает булево значение SyncedRole, имя роли "_synced", которое указывает, был ли элемент успешно обновлён на сервере. Эта роль, например, может использоваться для индикатора ожидания, пока свойство обновляется. В качестве альтернативы можно отслеживать состояние каждого EnginioReply, возвращаемого EnginioModel. Операция подтверждается, когда ответ завершен без ошибок.
Когда ответ завершается, пользователь отвечает за его удаление, это можно сделать, подключив сигнал finished к deleteLater.
QObject::connect(reply, &EnginioReply::finished, reply, &EnginioReply::deleteLater);
Примечание: небезопасно использовать оператор delete напрямую в finished.
Примечание: EnginioClient излучает сигналы finished и error для модели, а не сама модель.
Свойство query может содержать один или несколько параметров: параметр "sort" для получения предварительно отсортированных данных:
{
"objectType": "objects.fruits",
"sort": [{"sortBy":"price", "direction": "asc"}]
} Параметр "query" используется для фильтрации:
{
"objectType": "objects.fruits",
"query": {"name": {"$in": ["apple", "orange", "kiwi"]}}
} Параметр "limit" для ограничения количества результатов:
{
"objectType": "objects.fruits",
"limit": 10
} Параметр "offset" для пропуска некоторых результатов с начала набора результатов:
{
"objectType": "objects.fruits",
"offset": 10
} Параметры действительны только во время первоначальной загрузки модели и никоим образом не принудительно применяются при обновлении или ином изменении данных модели. QSortFilterProxyModel можно использовать для более продвинутой сортировки и фильтрации на стороне клиента.
EnginioModel не может определить, когда свойство результата вычисляется на бэкенде. Например, параметр "include" для query заполняет исходного создателя объекта полным объектом, представляющим "creator".
{
"objectType": "objects.fruits",
"include": {"creator": {}}
} Для модели свойство "creator" больше не является ссылкой (как на бэкенде), а полным объектом. Но в то время как полный объект доступен, попытки изменить данные объекта не будут успешны.
Документация свойств
client : EnginioClient *
Это свойство содержит EnginioClient, используемый моделью.
Функции доступа:
| EnginioClient * | client() const |
| void | setClient(const EnginioClient *client) |
Сигнал уведомления:
| void | clientChanged(EnginioClient *client) |
См. также EnginioClient.
operation : Enginio::Operation
Это свойство содержит тип операции запроса.
Функции доступа:
| Enginio::Operation | operation() const |
| void | setOperation(Enginio::Operation operation) |
Сигнал уведомления:
| void | operationChanged(Enginio::Operation operation) |
См. также Enginio::Operation и query().
query : QJsonObject
Это свойство содержит запрос, используемый для заполнения модели данными из бэкенда.
См. документацию EnginioClient::query() для получения информации о том, как создать запрос.
Хотя реализация EnginioClient query() возвращает данные запроса в виде объекта JSON, для модели запрос будет интерпретироваться как данные модели.
Как правило, запрос предназначен для одного типа объекта и вернёт все объекты в базе данных этого типа. Затем модель будет представлять каждый возвращённый объект как одну строку. Он может быть ограничен и отсортирован аналогично своему аналогу в EnginioClient.
Важно отметить, что модель не может сохранить тот же порядок сортировки, что и бэкенд, поэтому сортировка и ограничения сохраняются только до тех пор, пока не произойдёт вставка или удаление.
Функции доступа:
| QJsonObject | query() |
| void | setQuery(const QJsonObject &query) |
Сигнал уведомления:
| void | queryChanged(const QJsonObject &query) |
См. также EnginioClient::query().
Документация функций-членов
EnginioModel::EnginioModel(QObject *parent = Q_NULLPTR)
Создаёт новую модель с parent в качестве родительского объекта QObject.
EnginioModel::~EnginioModel()
Удаляет модель.
EnginioReply *EnginioModel::append(const QJsonObject &object)
Добавляет новый object в модель и базу данных.
Эта функция добавляет новый объект в кэш локальной модели и отправляет асинхронный запрос на бэкенд.
Поскольку добавление объекта в базу данных может завершиться ошибкой по разным причинам, возвращённый ответ необходимо сохранить и использовать для обработки ошибок (см. EnginioReply). Если операция завершится ошибкой, объект, который предполагалось добавить, будет удалён из локальной модели. Если модель используется в представлении, а бэкенд не принимает объект, потому что он нарушает валидатор, пользователю будет видно, что новая строка в представлении появляется и снова исчезает.
Возвращает EnginioReply с бэкенда.
См. также EnginioClient::create().
EnginioReply *EnginioModel::reload()
Перезагружает данные модели с сервера. Это аналогично reset и вызовет modelAboutToBeReset() и modelReset(). Эта функция делает внутреннее состояние модели недопустимым, перезагружает её с бэкенда и сбрасывает все представления.
Примечание: при использовании этой функции в то время как выполняются другие запросы к серверу, результат неопределён. Например, при вызове append() и затем reset() до завершения append, модель может или не может содержать результат операции append.
Возвращает ответ с бэкенда.
Эта функция была добавлена в Qt 1.1.
EnginioReply *EnginioModel::remove(int row)
Удаляет строку row из модели и базы данных.
Эта функция сразу удаляет row из локального кэша и отправляет запрос на удаление на бэкенд Enginio.
Возвращает EnginioReply с бэкенда.
См. также EnginioClient::remove().
EnginioReply *EnginioModel::setData(int row, const QVariant &value, const QString &role)
Обновляет значение в строке row локального кэша модели и отправляет запрос на обновление на бэкенд Enginio.
role — это свойство объекта, которое будет обновлено на новое значение value.
Возвращает ответ с бэкенда.
См. также EnginioClient::update().
EnginioReply *EnginioModel::setData(int row, const QJsonObject &value)
Это перегруженная функция.
Обновляет значение value в строке row локального кэша модели и отправляет запрос на обновление на бэкенд Enginio.
Все свойства value будут использованы для обновления элемента в row. Это может быть полезно для обновления нескольких свойств элементов одним запросом.
Возвращает ответ с бэкенда.
См. также EnginioClient::update().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/enginiomodel.html