警告
本节包含自动从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的集成#
本节提供了有关如何集成QGeoAddress
和QGeoLocation
的信息。
地址 - 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))