Интерфейсы между кодом C++ и QML в Qt Positioning
Обзор
В зависимости от типа класса C++, QtPositioning использует два метода для упрощения обмена данными о местоположении между кодом C++ и QML.
Прямая интеграция значений C++ в QtPositioning
Начиная с Qt 5.5, стало намного проще интегрировать типы данных, не являющиеся QObject, в QML. Это достигается добавлением поддержки Q_GADGET в QtQml. Макрос преобразует классы в облегченную версию QObject без обязательного наследования от QObject. В то же время он сохраняет возможности рефлексии QMetaObject. В результате они могут быть напрямую экспонированы в QML и не требуют дополнительных оберточных классов.
Значительное количество типов данных, связанных с позицией и местоположением, было преобразовано в Q_GADGET. Они сохраняют свой API и характеристики типов значений, но стали интроспективными через QMetaObject. Это преобразование было выполнено для следующих классов:
Используя QGeoCoordinate в качестве примера, типы C++ напрямую экспонируются в среду QML через его метатип:
qRegisterMetaType<QGeoCoordinate>(); QMetaType::registerEqualsComparator<QGeoCoordinate>();
Вышеуказанная регистрация QGeoCoordinate автоматически выполняется плагином QML QtPositioning один раз. Пример Plane Spotter демонстрирует эту функцию.
Интеграция на основе QVariant
В этом разделе приведена информация о том, как интегрировать QGeoAddress и QGeoLocation.
Адрес - QGeoAddress
Свойство Address.address используется для предоставления интерфейса между кодом C++ и QML. Сначала необходимо получить указатель на объект Address из C++, а затем использовать функции property() и setProperty() для получения и установки свойства address. Следующее получает QGeoAddress, представляющий этот объект из C++:
QGeoAddress geoAddress = qmlObject->property("address").value<QGeoAddress>(); Следующее устанавливает свойства этого объекта на основе объекта 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>(); Следующее устанавливает свойства этого объекта на основе объекта 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-5.15/positioning-cpp-qml.html