Интерфейсы между кодом C++ и QML в Qt Positioning
Обзор
Qt Positioning использует два метода для упрощения обмена данными о местоположении между кодом C++ и QML.
Прямая интеграция значений C++ в QtPositioning
Начиная с Qt 5.5, стало намного проще интегрировать типы данных, не основанные на QObject, в QML. Это достигается добавлением поддержки Q_GADGET в QtQml. Макрос преобразует классы в облегченную версию QObject без необходимости наследования от QObject. В то же время сохраняются возможности рефлексии QMetaObject. В результате их можно напрямую использовать в QML.
Значительное количество типов данных, связанных с местоположением, было преобразовано в Q_GADGETы. Они сохраняют свой API и свойства типа значения, но стали интроспективными через QMetaObject.
Макрос QML_ANONYMOUS используется для экспорта этих типов в среду QML. Подробности и полный список доступных макросов см. в документации QQmlEngine.
Однако классы напрямую не расширяются этим макросом, потому что мы не хотим, чтобы Qt Positioning зависел от QtQml. Поэтому для каждого из них создается вспомогательный класс, и используется макрос QML_FOREIGN:
struct QGeoCoordinateForeign
{
Q_GADGET
QML_FOREIGN(QGeoCoordinate)
QML_ANONYMOUS
QML_ADDED_IN_VERSION(5, 0)
}; Вышеуказанная регистрация типов Positioning выполняется автоматически плагином QML QtPositioning.
Интеграция на основе QVariant
В этом разделе приводится информация о том, как интегрировать QGeoAddress и QGeoLocation.
Адрес - QGeoAddress
Свойство Address.address используется для обеспечения интерфейса между кодом C++ и QML. Сначала необходимо получить указатель на объект Address из C++, затем использовать функции property() и setProperty() для получения и установки свойства address.
Следующий фрагмент кода получает объект QGeoAddress из C++:
QGeoAddress geoAddress = qmlObject->property("address").value<QGeoAddress>(); Следующий фрагмент кода устанавливает свойство address объекта QML на основе объекта QGeoAddress из C++:
qmlObject->setProperty("address", QVariant::fromValue(geoAddress)); Местоположение - QGeoLocation
Свойство Location.location используется для обеспечения интерфейса между кодом C++ и QML. Сначала необходимо получить указатель на объект Location из C++, затем использовать функции property() и setProperty() для получения и установки свойства location.
Следующий фрагмент кода получает объект QGeoLocation из C++:
QGeoLocation geoLocation = qmlObject->property("location").value<QGeoLocation>(); Следующий фрагмент кода устанавливает свойство location объекта QML на основе объекта QGeoLocation из C++:
qmlObject->setProperty("location", QVariant::fromValue(geoLocation));
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/positioning-cpp-qml.html