警告

本节包含从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的集成

本节提供有关如何集成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对象的位置属性:

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