Spec-Zone.ru › Qt 5.12

QML API мест

Обзор

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

Вводные понятия

Плагин

Плагин — это абстракция для бэкенда. Один плагин может получать доступ к местам с REST-сервера, а другой — из локальной базы данных. Следующий пример создаёт объект плагина с именем «osm». Имя плагина определяет, какой бэкенд использовать. Плагины также могут получать набор параметров, которые представляют собой набор пар ключ-значение. Параметры, которые можно указать, различаются в зависимости от бэкенда плагина. Документацию по возможным параметрам и нюансам каждого плагина см. в разделе «Ссылки на плагины».

Plugin {
    id: myPlugin
    name: "osm"
    //specify plugin parameters as necessary
    //PluginParameter {...}
    //PluginParameter {...}
    //...
}

Примечание: плагин HERE должен быть снабжён некоторыми обязательными параметрами, как описано в документации по плагину HERE.

Модели, представления и делегаты

QML API мест построен на концепции моделей, представлений и делегатов.

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

В разделе «Общие примеры использования» ниже показаны конкретные примеры того, как эти концепции работают вместе.

Общие примеры использования

Поиск мест

Поиск выполняется с помощью PlaceSearchModel. Свойство plugin определяет, какой бэкенд использовать для поиска. Параметры поиска могут быть заданы через свойства, такие как searchTerm и searchArea. Операцию поиска можно запустить, вызвав метод update(). Для простоты в примере ниже метод update() вызывается один раз после создания модели; обычно update() вызывается в ответ на действие пользователя, например, щелчок по кнопке. Пока операция поиска выполняется, свойство PlaceSearchModel::status переходит в состояние Loading и, при успешном завершении, переходит в состояние Ready.

PlaceSearchModel {
    id: searchModel

    plugin: myPlugin

    searchTerm: "pizza"
    searchArea: QtPositioning.circle(startCoordinate);

    Component.onCompleted: update()

}

Отображение результатов поиска с помощью ListView

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

В примере ниже модель поиска назначена свойству model ListView. При обновлении модели новыми результатами ListView автоматически обновляется, отражая новые данные модели.

Простой делегат привязан к свойству delegate ListView. PlaceSearchModel предоставляет набор ролей, из которых ниже используются роли title и place. Они имеют тип string и Place соответственно. По существу, для каждого элемента данных, который должен быть отображён в представлении, представление вызывает делегат, чтобы создать визуальное представление элемента.

ListView {
    anchors.fill: parent
    model: searchModel
    delegate: Component {
        Row {
            spacing: 5
            Marker { height: parent.height }
            Column {
                Text { text: title; font.bold: true }
                Text { text: place.location.address.text }
            }
        }
    }
}

Примечание: для простоты мы предположили, что каждый результат поиска имеет тип PlaceSearchResult и, следовательно, всегда имеет доступ к роли place. Другие типы результатов поиска могут не иметь роли place.

Полный исходный код см. в примере «Список мест».

Отображение результатов поиска с помощью MapItemView

Вместо ListView PlaceSearchModel можно использовать совместно с MapItemView для отображения маркеров на карте. Сначала используется Map для определения визуальной области, занимаемой картой, в данном случае она заполняет весь родительский элемент. Устанавливаются и другие свойства, такие как plugin, предоставляющий карты, а также центр и масштаб карты.

Внутри Map объявляется MapItemView, где свойство model установлено в модель поиска, а делегат, состоящий из MapQuickItem, используется для отображения изображения маркера. Маркер отображается для каждого места, найденного моделью поиска. Делегат использует роль place для позиционирования маркера.

Map {
    id: map
    anchors.fill: parent
    plugin: myPlugin;
    center: locationOslo
    zoomLevel: 13

    MapItemView {
        model: searchModel
        delegate: MapQuickItem {
            coordinate: place.location.coordinate

            anchorPoint.x: image.width * 0.5
            anchorPoint.y: image.height

            sourceItem: Column {
                Image { id: image; source: "marker.png" }
                Text { text: title; font.bold: true }
            }
        }
    }
}

Примечание: для простоты мы предположили, что каждый результат поиска имеет тип PlaceSearchResult и, следовательно, всегда имеет доступ к роли place. Другие типы результатов поиска могут не иметь роли place.

Полный исходный код см. в примере «Карта мест».

Получение подробной информации о месте

Для экономии пропускной способности бэкенд иногда возвращает места, частично заполненные деталями. Это можно проверить с помощью свойства Place::detailsFetched, которое указывает, были ли получены все доступные детали. Если нет, можно вызвать метод Place::getDetails() для получения оставшихся данных.

if (!place.detailsFetched)
    place.getDetails();

Сохранение и удаление мест

Некоторые бэкенды могут поддерживать сохранение и удаление мест. Это можно сделать, вызвав методы Place::save() и Place::remove() соответственно. Обратите внимание, что для сохранения Place должен быть назначен Plugin, чтобы указать, в какой бэкенд сохранять. Свойство status перейдёт в состояние Saving во время операции сохранения и после успешного завершения перейдёт в состояние Ready. Следующий фрагмент кода демонстрирует, как сохранить и удалить место с помощью JavaScript.

//creating and saving a place
var place = Qt.createQmlObject('import QtLocation 5.3; Place { }', parent);
place.plugin = myPlugin;
place.name = "New York";
place.location.coordinate.latitude = 40.7
place.location.coordinate.longitude = -74.0
place.save();

//removing a place
place.remove();

Дополнительная информация

Приведённые выше фрагменты кода демонстрируют только небольшую часть функциональности API мест. См. раздел «Типы мест» ниже для более подробной информации о таких элементах, как изображения, отзывы и т. д., а также более подробные описания и пояснения.

Также см. пример «Места (QML)» для более подробного демонстрации использования API.

Типы мест

Типы данных

Категория

Тип представляет категорию, к которой может быть отнесено место.

ContactDetail

Тип содержит контактные данные, такие как номер телефона или адрес веб-сайта.

ContactDetails

Тип содержит контактные данные для места.

ExtendedAttributes

Тип содержит дополнительные данные о месте.

Иконка

Тип представляет источник изображения иконки, который может иметь несколько размеров.

Место

Тип представляет место, представляющее интерес.

PlaceAttribute

Тип содержит общие данные об атрибутах места.

Рейтинги

Тип содержит рейтинг места.

Поставщик

Содержит данные о поставщике места, изображении, отзыве или редакторском материале.

Пользователь

Тип идентифицирует пользователя, который предоставил конкретный элемент содержимого Place.

Модели

CategoryModel

Тип предоставляет модель категорий, поддерживаемых плагином

EditorialModel

Тип предоставляет модель редакторских заметок мест

ImageModel

Тип предоставляет модель изображений мест

PlaceSearchModel

Предоставляет доступ к результатам поиска мест

PlaceSearchSuggestionModel

Предоставляет доступ к предложениям по поисковым запросам

ReviewModel

Предоставляет доступ к отзывам о месте

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/location-places-qml.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API