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:

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));