警告

本节包含自动从C++翻译至Python的代码片段,可能包含错误。

C++与QML代码之间的Qt定位接口#

描述了在C++和QML代码之间交换位置数据的方法。

概述#

Qt定位利用两种方法简化了C++和QML代码之间的位置数据交换。

Qt定位中C++值直接集成#

从Qt 5.5开始,将非QObject基于的数据类型集成到QML变得更加容易。这是通过向QtQml添加Q_GADGET支持来实现的。该宏将类转换为轻量级的QObject版本,无需QObject继承。同时,它保留了QMetaObject的反射功能。因此,它们可以直接暴露给QML。

大量位置相关数据类型被转换为Q_GADGET。它们保留了其API和值类型特征,但可以通过QMetaObject进行了解。

使用QML_ANONYMOUS宏将这些类型暴露到QML环境中。有关更多详细信息,请参阅QQmlEngine文档和可用的宏的完整列表。

然而,由于我们不希望Qt定位依赖于QtQml,所以不直接用此宏扩展类。因此,为每个类创建了一个辅助类,并使用QML_FOREIGN宏。

struct QGeoCoordinateForeign
{
    Q_GADGET
    QML_FOREIGN(QGeoCoordinate)
    QML_ANONYMOUS
    QML_ADDED_IN_VERSION(5, 0)
};

上述定位类型的注册是由QtPositioning QML插件自动执行一次的。

基于QVariant的集成#

本节提供了有关如何集成QGeoAddressQGeoLocation的信息。

地址 - QGeoAddress#

使用Address.address属性来提供C++和QML代码之间的接口。首先必须从C++中获取一个指向Address对象的指针,然后使用property()和setProperty()函数获取和设置address属性。

以下代码段从C++中获取QGeoAddress对象:

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

以下代码块根据C++中的 QGeoAddress 对象设置QML对象的地址属性

qmlObject.setProperty("address", QVariant.fromValue(geoAddress))

位置 - QGeoLocation#

Location.location 属性用于在C++和QML代码之间提供接口。首先必须从C++中获取到一个 Location 对象的指针,然后必须使用 property() 和 setProperty() 函数来获取和设置 location 属性。

以下代码块从C++中获取 QGeoLocation 对象

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

以下代码块根据C++中的 QGeoLocation 对象设置QML对象的location属性

qmlObject.setProperty("location", QVariant.fromValue(geoLocation))