Qt 5.9 | Qt Positioning | Interfaces between C++ and QML Code in Qt Positioning

Qt 5.9.4 Reference Documentation

# Interfaces between C++ and QML Code in Qt Positioning

## Overview

Depending on the type of C++ class QtPositioning utilizes two methods to simplify exchange of position data between C++ and QML code.

## Direct C++ Value Integration in QtPositioning

Starting with Qt 5.5, it has become much easier to integrate non-QObject based data types into QML. This is achieved by adding Q_GADGET support to QtQml. The macro converts classes into a light-weight version of a QObject without the required QObject inheritance. At the same time it retains the reflection capabilities of QMetaObject. As a result they can be directly exposed to QML and do not require any further wrapper classes.

A significant number of Position and Location related data types were converted to Q_GADGETs. They retain their API and value type character but have become introspectable via QMetaObject. This conversion was done to the following classes:

- QGeoCircle
- QGeoCoordinate
- QGeoRectangle
- QGeoShape

Using QGeoCoordinate as an example, the C++ types are directly exposed to the QML environment via its meta type:

      qRegisterMetaType<QGeoCoordinate>();
      QMetaType::registerEqualsComparator<QGeoCoordinate>();

The above registration of QGeoCoordinate is automatically done once by the QtPositioning QML plugin. The Plane Spotter example demonstrates this feature.

## QVariant Based integration

This section provides information on how to integrate QGeoAddress and QGeoLocation.

### Address - QGeoAddress

The Address.address property is used to provide an interface between C++ and QML code. First a pointer to a Address object must be obtained from C++, then use the property() and setProperty() functions to get and set the `address` property. The following gets the QGeoAddress representing this object from C++:

       QGeoAddress geoAddress = qmlObject->property("address").value<QGeoAddress>();

The following sets the properties of this object based on a QGeoAddress object from C++:

      qmlObject->setProperty("address", QVariant::fromValue(geoAddress));

### Location - QGeoLocation

The Location.location property is used to provide an interface between C++ and QML code. First a pointer to a Location object must be obtained from C++, then use the property() and setProperty() functions to get and set the `location` property. The following gets the QGeoLocation representing this object from C++:

      QGeoLocation geoLocation = qmlObject->property("location").value<QGeoLocation>();

The following sets the properties of this object based on a QGeoLocation object from C++:

      qmlObject->setProperty("location", QVariant::fromValue(geoLocation));