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&
lt;QGeoCoordinate&
gt;();
QMetaType::
registerEqualsComparator&
lt;QGeoCoordinate&
gt;();
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-&
gt;property("address"
).value&
lt;QGeoAddress&
gt;();
The following sets the properties of this object based on a QGeoAddress object from C++:
qmlObject-&
gt;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-&
gt;property("location"
).value&
lt;QGeoLocation&
gt;();
The following sets the properties of this object based on a QGeoLocation object from C++:
qmlObject-&
gt;setProperty("location"
, QVariant::
fromValue(geoLocation));