Qt定位中C++与QML代码的接口

概述

Qt定位通过两种方法简化C++和QML代码之间位置数据交换。

QtPositioning中直接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)
};

Qt定位QML插件将自动完成上述位置类型注册。

基于QVariant的集成

本节提供有关如何集成QGeoAddress和QGeoLocation的信息。

地址 - QGeoAddress

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

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

 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 对象。

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

以下代码片段根据从 C++ 获取的 QGeoLocation 对象设置 QML 对象的位置属性。

qmlObject->setProperty("location", QVariant::fromValue(geoLocation));

© 2024 Qt 公司有限。此处包含的文档贡献版权属于各自的所有者。此处提供的文档受 GNU 自由文档许可证第 1.3 版 的条款约束,由自由软件基金会发布。Qt 和相关商标是芬兰 Qt 公司及其在全世界范围内的商标。所有其他商标均为其各自所有者的财产。