警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
Qt定位中C++与QML代码之间的接口¶
描述了用于在C++和QML代码之间交换位置数据的方法。
概述¶
Qt Positioning 使用两种方法来简化 C++ 和 QML 代码之间的位置数据交换。
在QtPositioning中直接集成C++值¶
从Qt 5.5开始,将非基于QObject的数据类型集成到QML中变得更加容易。这是通过向QtQml添加Q_GADGET支持来实现的。该宏将类转换为QObject的轻量级版本,而无需继承QObject。同时,它保留了QMetaObject的反射能力。因此,它们可以直接暴露给QML。
大量与位置相关的数据类型被转换为Q_GADGETs。它们保留了它们的API和值类型特性,但可以通过QMetaObject进行内省。
QML_ANONYMOUS宏用于将这些类型暴露给QML环境。有关更多详细信息和可用宏的完整列表,请参阅QQmlEngine文档。
然而,这些类并没有直接通过这个宏进行扩展,因为我们不希望Qt Positioning依赖于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对象的位置属性:
qmlObject.setProperty("location", QVariant.fromValue(geoLocation))