Qt位置定位的更改

Qt 6是经过深思熟虑的努力,使得框架更加高效和易于使用的结果。

我们试图在每个版本中维护所有公共API的二进制和源代码兼容性。但为了使Qt成为更好的框架,一些变化是不可避免的。

在本主题中,我们总结了Qt位置定位中的这些更改,并提供处理这些更改的指南。

破坏公共API的变化

本节包含有关破坏源代码兼容性的API更改的信息。

重命名QGeoPolygon::path()

QGeoPolygon::path()QGeoPolygon::setPath()方法分别重命名为QGeoPolygon::perimeter()和QGeoPolygon::setPerimeter()。在QML方面,QGeoPolygon::perimeter属性可以使用而无需任何更改。

QGeoShape代替QGeoLocation包围面积

QGeoLocation类及其QML对应物Location已被更新为使用QGeoShape而不是QGeoRectangle作为包围面积。

C++

QGeoLocation::boundingBox()QGeoLocation::setBoundingBox()分别替换为QGeoLocation::boundingShape()和QGeoLocation::setBoundingShape()。现在使用QGeoShape对象作为底层数据存储。

QML

QGeoLocation::boundingBox属性被替换为QGeoLocation::boundingShape。此属性自QtPositioning 6.2起可用,因此请确保更新QML文件中的导入版本。

import QtPositioning 6.2

删除QGeoShape::extendShape()

QGeoShape::extendShape()方法自Qt 5.9开始被弃用,并在Qt 6中最终被移除。如果您需要为这些类使用此功能,请使用QGeoRectangle::extendRectangle()和QGeoCircle::extendCircle()。

将信号error重命名为errorOccurred

在Qt 5中,多个Qt位置定位类具有error()信号,这与error()方法冲突。在Qt 6中,我们把这些信号重命名为errorOccurred()。具体来说:

移除更新超时信号

在Qt 5中,QGeoPositionInfoSource::updateTimeout()QGeoSatelliteInfoSource::requestTimeout()信号用于通知当前位置或卫星信息在指定超时时间内无法获取的情况。这些信号在Qt 6中被移除。现在使用具有新错误类型的errorOccurred()信号替代。具体来说:

同样的更改适用于PositionSource QML对象。现在移除了PositionSource::updateTimeout()信号,而是使用具有PositionSource.UpdateTimeoutErrorPositionSource::sourceError属性替代。

重新设计NMEA支持

在Qt 5中,我们有一个serialnmea定位插件和PositionSource对象的nmeaSource属性。

该插件通过串行端口提供对NMEA流的访问,而QML对象则负责从TCP套接字或本地文件读取NMEA流。

在Qt 6中,我们将所有这些功能集成到插件中,该插件现在被重命名为nmea。它现在能够与所有三种NMEA数据源(串行端口、TCP套接字和本地文件)一起工作。详情请参阅插件描述

PositionSource对象的nmeaSource属性现在已被移除。

其他API更改

本节包含不影响源兼容性的API改进。然而,它们可能会影响应用程序逻辑,因此了解这些更改仍然很有用。

正确重置错误

在Qt 5中,QGeoAreaMonitorSourceQGeoPositionInfoSourceQGeoSatelliteInfoSource类的错误从不重置。这种行为是不合逻辑的,因为对这些类或其子类调用startUpdates()startMonitoring()requestUpdates()实际上意味着启动新工作会话,这意味着我们不应关心之前的错误。从Qt 6开始,在调用上述方法之一后,将错误重置为NoError

添加QGeoAddress::streetNumber

QGeoAddress类已扩展,新增streetNumber属性,它包含关于门牌号、建筑物名称或其他可以区分地址的信息。使用streetNumber()和setStreetNumber()从C++代码访问此属性。

QGeoAddress::street现在只包含街道名称。

相同的规则适用于地址的QML对应物。现在,Address::street属性仅用于街道名称,而Address::streetNumber属性用于其他重要的地址详细信息。

将超时参数添加到PositionSource::update()

超时以毫秒为单位指定。如果超时为零(默认值),则默认为适合该源的一个合理的超时时间。

重构QGeoSatelliteInfoQGeoPositionInfoQGeoAreaMonitorInfo

这些类现在在其实现中使用了QExplicitlySharedDataPointer。这意味着这些类实现了写时复制(copy-on-write)。这使得它们易于复制,因此可以通过值传递。

另一个改进是支持高效的移动操作。

Qt定位插件实现中的更改

本节提供有关插件接口更改的信息。

在Qt 5中,我们有两个版本的插件接口:

  • QGeoPositionInfoSourceFactory,提供了基本功能。
  • QGeoPositionInfoSourceFactoryV2,通过为创建的对象提供自定义参数而扩展了基础类。

在Qt 6中,我们将这两个实现合并为之一,只留下QGeoPositionInfoSourceFactory类。现在,它的方法允许传递自定义参数。

注意: 接口标识符已更新以反映主要版本更新。在您的Qt定位插件中使用"org.qt-project.qt.position.sourcefactory/6.0"

以下是一个插件类声明的示例

class MyPlugin : public QObject, public QGeoPositionInfoSourceFactory
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0"
                      FILE "plugin.json")
    Q_INTERFACES(QGeoPositionInfoSourceFactory)

public:
    QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap &parameters) override;
    QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap &parameters) override;
    QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap &parameters) override;
};

© 2024 Qt公司有限公司。本文件中包含的文档贡献为各自所有者的版权所拥有。本文件提供的文档是根据由自由软件基金会发布的GNU自由文档许可证版本1.3的条款授予的。Qt和相应标志是芬兰Qt公司及其在世界各地的商标。所有其他商标都是其各自所有者的财产。