对Qt Positioning
Qt 6 是有意识地提高框架效率和易用性的结果。
我们尝试在每个版本中保持所有公共 API 的二进制和源代码兼容性。但为了使 Qt 成为一个更好的框架,有些改动是不可避免的。
在本专题中,我们总结了Qt Positioning 中的这些更改,并提供了处理这些更改的指导。
破坏公共 API 的更改
本节包含有关破坏源代码兼容性的 API 变动的信息。
重命名 QGeoPolygon::path()
QGeoPolygon::path()
和QGeoPolygon::setPath()
方法分别重命名为QGeoPolygon::perimeter() 和QGeoPolygon::setPerimeter()。在 QML 端,可以使用QGeoPolygon::perimeter 属性,无需做任何更改。
QGeoShape 用于QGeoLocation 边界区域
QGeoLocation 类及其Location QML 对应项已更新为使用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 Positioning 类都有error()
信号,这与error()
方法冲突。在 Qt XML 6 中,我们将这些信号重命名为errorOccurred()
:
QGeoAreaMonitorSource::error()
更名为 () 。QGeoAreaMonitorSource::errorOccurredQGeoPositionInfoSource::error()
更名为 ().QGeoPositionInfoSource::errorOccurredQGeoSatelliteInfoSource::error()
更名为 () 。QGeoSatelliteInfoSource::errorOccurred
删除更新超时信号
在 Qt XML 5 中,QGeoPositionInfoSource::updateTimeout()
和QGeoSatelliteInfoSource::requestTimeout()
信号用于通知在指定超时内无法检索到当前位置或卫星信息的情况。这些信号已在 Qt 6 中删除。取而代之的是带有新错误类型的errorOccurred()
信号。具体来说
- QGeoPositionInfoSource 使用带有新的 错误代码的 () 信号。QGeoPositionInfoSource::UpdateTimeoutError errorOccurred
- QGeoSatelliteInfoSource 使用带有新的 错误代码的 () 信号。QGeoSatelliteInfoSource::UpdateTimeoutError errorOccurred
同样的更改也适用于PositionSource QML 对象。删除PositionSource::updateTimeout()
信号。使用带有PositionSource.UpdateTimeoutError
的PositionSource::sourceError 属性。
重新设计 NMEA 支持
在 Qt XML 5 中,我们有一个serialnmea定位插件和PositionSource 对象中的nmeaSource
属性。
插件通过串口访问 NMEA 数据流,而 QML 对象则负责从 TCP 套接字或本地文件读取 NMEA 数据流。
在 Qt 6 中,我们在插件中加入了所有这些功能,该插件现在更名为nmea。它现在可以处理所有三种 NMEA 数据源:串行端口、TCP 套接字和本地文件。详情请参见插件说明。
PositionSource 对象的nmeaSource
属性现已删除。
其他应用程序接口更改
本节包含不会破坏源兼容性的 API 改进。不过,它们可能会对应用程序逻辑产生影响,因此了解它们仍然很有用。
正确重置错误
在 Qt XML 5 中,QGeoAreaMonitorSource 、QGeoPositionInfoSource 和QGeoSatelliteInfoSource 类的错误从未重置过。这种行为不符合逻辑,因为在这些类或其子类中调用startUpdates()
、startMonitoring()
或requestUpdates()
实际上意味着启动一个新的工作会话,这意味着我们不应关心以前的错误。自 Qt XML 6 起,一旦调用上述方法之一,我们就会将错误重置为NoError
。
添加QGeoAddress::streetNumber
QGeoAddress 类扩展了streetNumber 属性,该属性包含街道编号、建筑物名称或其他任何可能用于区分地址的信息。使用streetNumber() 和setStreetNumber() 可以从 C++ 代码中访问该属性。
QGeoAddress::street 现在只保存街道名称。
这同样适用于Address QML 对应属性。Address::street 属性现在只用于街道名称,而Address::streetNumber 属性用于其他重要的地址细节。
添加超时参数PositionSource::update()
timeout
的指定单位是毫秒。如果timeout
为零(默认值),则默认为适合源的合理超时时间。
重构QGeoSatelliteInfo 、QGeoPositionInfo 和QGeoAreaMonitorInfo 类
这些类现在使用QExplicitlySharedDataPointer 实现。这意味着这些类实现了写时复制。这使得它们的复制成本很低,因此可以按值传递。
另一项改进是增加了对高效移动操作的支持。
Qt Positioning 插件实现中的变化
本节介绍插件接口的变化。
在 Qt 5 中,我们有两个版本的插件接口:
QGeoPositionInfoSourceFactory
提供基本功能。QGeoPositionInfoSourceFactoryV2
扩展了基类,可为创建的对象提供自定义参数。
在 Qt XML 6 中,我们将这两种实现合二为一,只保留了QGeoPositionInfoSourceFactory 类。它的方法现在允许传递自定义参数。
注: 接口标识符已更新,以反映主要版本的更新。请在您的Qt Positioning 插件中使用"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 ¶meters) override; QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) override; QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; };
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.