QGeoPositionInfoSource Class
QGeoPositionInfoSource 类是用于分发位置更新的抽象基类。更多内容...
| 头文件: | #include <QGeoPositionInfoSource> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Positioning) target_link_libraries(mytarget PRIVATE Qt6::Positioning) |
| qmake: | QT += positioning |
| 继承自: | QObject |
| 被继承者: |
公共类型
| enum | Error { AccessError, ClosedError, NoError, UnknownSourceError, UpdateTimeoutError } |
| enum | PositioningMethod { NoPositioningMethods, SatellitePositioningMethods, NonSatellitePositioningMethods, AllPositioningMethods } |
| flags | PositioningMethods |
属性
- minimumUpdateInterval : int
- preferredPositioningMethods : PositioningMethods
- sourceName : QString
- updateInterval : int
公共函数
| QGeoPositionInfoSource(QObject *parent) | |
| virtual | ~QGeoPositionInfoSource() |
(since Qt 5.14) virtual QVariant | backendProperty(const QString &name) const |
| QBindable<QGeoPositionInfoSource::PositioningMethods> | bindablePreferredPositioningMethods() |
| QBindable<int> | bindableUpdateInterval() |
| virtual QGeoPositionInfoSource::Error | error() const = 0 |
| virtual QGeoPositionInfo | lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const = 0 |
| virtual int | minimumUpdateInterval() const = 0 |
| QGeoPositionInfoSource::PositioningMethods | preferredPositioningMethods() const |
(since Qt 5.14) virtual bool | setBackendProperty(const QString &name, const QVariant &value) |
| virtual void | setPreferredPositioningMethods(QGeoPositionInfoSource::PositioningMethods methods) |
| virtual void | setUpdateInterval(int msec) |
| QString | sourceName() const |
| virtual QGeoPositionInfoSource::PositioningMethods | supportedPositioningMethods() const = 0 |
| int | updateInterval() const |
公共插槽
| virtual void | requestUpdate(int timeout = 0) = 0 |
| virtual void | startUpdates() = 0 |
| virtual void | stopUpdates() = 0 |
信号
| void | errorOccurred(QGeoPositionInfoSource::Error positioningError) |
| void | positionUpdated(const QGeoPositionInfo &update) |
(since Qt 5.12) void | supportedPositioningMethodsChanged() |
静态公共成员
| QStringList | availableSources() |
| QGeoPositionInfoSource * | createDefaultSource(QObject *parent) |
(since Qt 5.14) QGeoPositionInfoSource * | createDefaultSource(const QVariantMap ¶meters, QObject *parent) |
| QGeoPositionInfoSource * | createSource(const QString &sourceName, QObject *parent) |
(since Qt 5.14) QGeoPositionInfoSource * | createSource(const QString &sourceName, const QVariantMap ¶meters, QObject *parent) |
详细说明
静态函数 `QGeoPositionInfoSource::createDefaultSource()` 会创建一个适合该平台的默认位置源(如果存在的话)。否则,`QGeoPositionInfoSource` 将检查是否有可用的插件实现了 `QGeoPositionInfoSourceFactory ` 接口。
QGeoPositionInfoSource 子类的用户可以使用requestUpdate() 请求当前位置,或使用startUpdates() 和stopUpdates() 启动和停止定期位置更新。当有更新可用时,会触发positionUpdated() 事件。可通过lastKnownPosition() 获取最后已知的位置。
如果需要定期的位置更新,可以使用setUpdateInterval() 来指定这些更新的发布频率。如果未指定间隔,则会在有更新时立即提供。例如:
// Emit updates every 10 seconds if available
QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(0);
if (source)
source->setUpdateInterval(10000);要移除先前设置的更新间隔,请调用setUpdateInterval() 并将其值设为 0。
注意: 位置源可能对更新间隔有最小值要求,具体由minimumUpdateInterval() 返回。
注意:若要在 Android 服务中使用此类,请参阅Android 平台上的Qt Positioning 。
成员类型文档
enum QGeoPositionInfoSource::Error
Error 枚举表示可能发生的错误。
| 常量 | 值 | 描述 |
|---|---|---|
QGeoPositionInfoSource::AccessError | 0 | 由于应用程序缺乏所需的权限,与远程定位后端的连接建立失败。 |
QGeoPositionInfoSource::ClosedError | 1 | 远程定位后端关闭了连接,例如当用户将定位服务关闭时,就会发生这种情况。一旦重新启用定位服务,常规更新将恢复。 |
QGeoPositionInfoSource::NoError | 3 | 未发生任何错误。 |
QGeoPositionInfoSource::UnknownSourceError | 2 | 发生了一个未识别的错误。 |
QGeoPositionInfoSource::UpdateTimeoutError (since Qt 6.2) | 4 | 如果调用了requestUpdate(),则此错误表示无法在指定的超时时间内获取当前位置。如果调用了startUpdates(),则此错误表示该QGeoPositionInfoSource 子类确定无法提供进一步的定期更新。在后一种情况下,直到定期更新恢复后,该错误才会再次发出。 |
enum QGeoPositionInfoSource::PositioningMethod
flags QGeoPositionInfoSource::PositioningMethods
定义了定位方法的类型。
| 常量 | 值 | 描述 |
|---|---|---|
QGeoPositionInfoSource::NoPositioningMethods | 0x00000000 | 不采用任何定位方法。 |
QGeoPositionInfoSource::SatellitePositioningMethods | 0x000000ff | 基于卫星的定位方法,例如 GPS 或 GLONASS。 |
QGeoPositionInfoSource::NonSatellitePositioningMethods | 0xffffff00 | 其他定位方法,例如基于 3GPP 小区标识符或 Wi-Fi 的定位。 |
QGeoPositionInfoSource::AllPositioningMethods | 0xffffffff | 一旦可用,即采用基于卫星的定位方法。否则采用非卫星定位方法。 |
PositioningMethods 类型是QFlags<PositioningMethod> 的 typedef。它存储 PositioningMethod 值的“或”组合。
属性文档
[read-only] minimumUpdateInterval : int
该属性存储了获取位置更新所需的最短时间(以毫秒为单位)。
这是setUpdateInterval()和requestUpdate()函数所接受的最小值。
访问函数:
| virtual int | minimumUpdateInterval() const = 0 |
[bindable] preferredPositioningMethods : PositioningMethods
注意:此 属性支持QProperty 绑定。
设置此源的首选定位方法。
如果新方法中包含源不支持的方法,则该不支持的方法将被忽略。
如果新方法中不包含源设备可用或支持的任何一种方法,则首选方法将设置为源设备可用的方法集。如果源设备没有可用方法(例如,因为其定位服务已关闭或不提供定位服务),则直接接受传入的方法。
此属性的默认值为NoPositioningMethods 。
注意:子类 实现必须调用setPreferredPositioningMethods() 的基类实现,以确保preferredPositioningMethods() 返回正确的值。
访问函数:
| QGeoPositionInfoSource::PositioningMethods | preferredPositioningMethods() const |
| virtual void | setPreferredPositioningMethods(QGeoPositionInfoSource::PositioningMethods methods) |
另请参阅 supportedPositioningMethods()。
[read-only] sourceName : QString
该属性存储了当前正在使用的位置源实现的唯一名称。
该名称与传递给createSource()以创建特定位置源实现的新实例时所用的名称相同。
访问函数:
| QString | sourceName() const |
[bindable] updateInterval : int
注意:此 属性支持QProperty 绑定。
该属性存储每次更新之间所需的间隔(以毫秒为单位)。
如果未设置更新间隔(或设置为 0),源将根据需要提供更新。
如果设置了更新间隔,源将以尽可能接近请求间隔的间隔提供更新。如果请求间隔小于minimumUpdateInterval(),则改用最小间隔。
更新间隔的更改将在实际可行的情况下尽快生效,但更改所需的时间可能因实现而异。上一个间隔的已过去时间是否计入新间隔,也取决于具体实现。
该属性的默认值为 0。
注意:子类 实现必须调用setUpdateInterval() 的基类实现,以确保updateInterval() 返回正确的值。
注意:此 属性无法用于调整 iOS 和 macOS 上的更新频率,因为其 API 不提供此类功能。在这些系统上,该参数仅用于设置 `UpdateTimeoutError `,并在指定时间间隔内未收到更新时触发 `errorOccurred ` 信号。
访问函数:
| int | updateInterval() const |
| virtual void | setUpdateInterval(int msec) |
成员函数文档
[explicit] QGeoPositionInfoSource::QGeoPositionInfoSource(QObject *parent)
创建一个带有指定parent 的定位源。
[virtual noexcept] QGeoPositionInfoSource::~QGeoPositionInfoSource()
销毁位置源。
[static] QStringList QGeoPositionInfoSource::availableSources()
返回一个包含可用源插件的列表。其中包含当前平台的任何默认后端插件。
[virtual, since Qt 5.14] QVariant QGeoPositionInfoSource::backendProperty(const QString &name) const
如果存在名为name 的后端特定属性,则返回该属性的值;否则,返回的值将无效。支持的后端特定属性及其说明请参见Qt Positioning plugins#Default plugins。
该函数于 Qt 5.14 中引入。
另请参阅 setBackendProperty 。
[static] QGeoPositionInfoSource *QGeoPositionInfoSource::createDefaultSource(QObject *parent)
创建并返回一个位置来源,该来源使用指定的parent 从系统的默认位置数据源读取数据,或者使用可用优先级最高的插件。
如果系统没有默认位置来源、未找到有效的插件,或者用户无权访问当前位置,则返回nullptr 。
[static, since Qt 5.14] QGeoPositionInfoSource *QGeoPositionInfoSource::createDefaultSource(const QVariantMap ¶meters, QObject *parent)
创建并返回一个位置来源,该来源使用给定的parent ,从系统的默认位置数据来源或可用优先级最高的插件中读取数据。
如果系统没有默认位置来源、未找到有效的插件,或者用户无权访问当前位置,则返回nullptr 。
此方法将 `parameters ` 传递给工厂类以配置该源。
该函数于 Qt 5.14 中引入。
[static] QGeoPositionInfoSource *QGeoPositionInfoSource::createSource(const QString &sourceName, QObject *parent)
通过加载名为sourceName 的插件,创建并返回一个具有指定parent 的定位源。
如果找不到该插件,则返回nullptr 。
[static, since Qt 5.14] QGeoPositionInfoSource *QGeoPositionInfoSource::createSource(const QString &sourceName, const QVariantMap ¶meters, QObject *parent)
通过加载名为sourceName 的插件,创建并返回一个具有指定parent 的位置源。
如果找不到该插件,则返回nullptr 。
该方法将parameters 传递给工厂以配置该源。
该函数在 Qt 5.14 中引入。
[pure virtual] QGeoPositionInfoSource::Error QGeoPositionInfoSource::error() const
返回上次发生的错误类型。
注意:自 Qt6起, 调用 `startUpdates()` 或 `requestUpdate()` 时,最后一次错误总是会被重置。
[signal] void QGeoPositionInfoSource::errorOccurred(QGeoPositionInfoSource::Error positioningError)
该信号在发生错误后发出。positioningError 参数描述了发生的错误类型。
[pure virtual] QGeoPositionInfo QGeoPositionInfoSource::lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const
返回包含最后已知位置的更新,若无可用位置,则返回空更新。
如果 `fromSatellitePositioningMethodsOnly ` 为真,则返回从卫星定位方法接收到的最后已知位置;如果没有可用位置,则返回空更新。
[signal] void QGeoPositionInfoSource::positionUpdated(const QGeoPositionInfo &update)
如果调用了startUpdates()或requestUpdate(),当有更新可用时,将触发此信号。
update 变量存储新更新的值。
[pure virtual slot] void QGeoPositionInfoSource::requestUpdate(int timeout = 0)
尝试获取当前位置,并利用该信息触发positionUpdated()信号。如果在给定的timeout (以毫秒为单位)内无法找到当前位置,或者timeout 小于minimumUpdateInterval()返回的值,则会触发一个带有UpdateTimeoutError 的errorOccurred()信号。
如果超时时间为零,则超时时间将默认设置为适合该源的合理超时周期。
如果另一个更新请求正在进行中,则此操作不会产生任何效果。但是,即使已经调用了startUpdates() 且常规更新正在进行中,也可以调用此函数。
如果源使用多种定位方法,它将尝试在给定的超时时间内从最精确的定位方法中获取当前位置。
注意:从 Qt6开始, 该方法在请求位置之前,总会将最后一个错误重置为NoError 。
注意:要 了解如何在 Android 服务中使用此方法,请参阅Android 上的Qt Positioning 。
[virtual, since Qt 5.14] bool QGeoPositionInfoSource::setBackendProperty(const QString &name, const QVariant &value)
将名为name 的后端特定属性设置为value 。成功时返回true ,否则返回false 。后端特定属性可用于在运行时配置定位子系统的行为。支持的后端特定属性及其说明详见Qt Positioning plugins#Default plugins。
该函数于 Qt 5.14 中引入。
另请参阅 backendProperty 。
[pure virtual slot] void QGeoPositionInfoSource::startUpdates()
开始按setUpdateInterval()中指定的间隔定期发布更新。
如果尚未调用setUpdateInterval(),源将在更新一经可用时立即发出更新。
如果该QGeoPositionInfoSource 子类确定无法提供定期更新,则会发出带有UpdateTimeoutError 的errorOccurred() 信号。这可能发生在卫星定位丢失或检测到硬件错误的情况下。如果后续数据可用,位置更新将重新开始。在定期更新恢复之前,UpdateTimeoutError 错误不会再次发出。
注意:自 Qt6起 ,该方法在开始更新前会始终将最后一个错误重置为NoError 。
注意:要 了解如何在 Android 服务中使用此方法,请参阅Android 平台上的Qt Positioning 。
在 iOS 8 及更高版本中,Core Location 框架要求在应用程序的 Info.plist 文件中添加额外条目,键名为 NSLocationAlwaysUsageDescription 或 NSLocationWhenInUseUsageDescription,并包含将在授权提示中显示的字符串。 键 NSLocationWhenInUseUsageDescription 用于在应用处于前台时请求使用位置服务的权限。 键 NSLocationAlwaysUsageDescription 用于请求在应用运行时(包括前台和后台)使用定位服务的权限。如果同时定义了这两个条目,在前台模式下 NSLocationWhenInUseUsageDescription 具有优先级。
[pure virtual slot] void QGeoPositionInfoSource::stopUpdates()
停止按固定间隔发送更新。
[pure virtual] QGeoPositionInfoSource::PositioningMethods QGeoPositionInfoSource::supportedPositioningMethods() const
返回该来源可用的定位方法。可用性是指在调用此函数时可用的状态。因此,诸如关闭定位服务或对基于卫星的定位提供商设置限制等用户设置,都会体现在此函数的返回结果中。当状态发生变化时,可通过supportedPositioningMethodsChanged() 获取运行时通知。
并非所有平台都能区分不同的定位方法,或传达设备的当前用户配置。下表概述了当前各平台的情况:
| 平台 | 简要说明 |
|---|---|
| Android | 当定位服务处于活动状态时,可获取各提供商的状态及定位服务的总体状态,并会进行通报。 |
| GeoClue | 已硬编码为始终返回AllPositioningMethods 。 |
| GeoClue2 | 无法区分各个提供商,但会反映已禁用的位置服务状态。 |
| iOS | 硬编码为始终返回AllPositioningMethods 。 |
| macOS | 硬编码为始终返回AllPositioningMethods 。 |
| Windows (UWP) | 虽然无法区分各个提供商,但已禁用的定位服务会被反映出来。 |
另请参阅 supportedPositioningMethodsChanged() 和setPreferredPositioningMethods()。
[signal, since Qt 5.12] void QGeoPositionInfoSource::supportedPositioningMethodsChanged()
当支持的定位方法发生变化时,会发出此信号。导致变化的原因可能是用户开启或关闭了定位服务,或者将定位服务限制为特定类型(例如仅限 GPS)。请注意,并非所有平台都能检测到支持的定位方法的变化。supportedPositioningMethods() 提供了当前平台支持情况的概览。
该函数于 Qt 5.12 版本中引入。
© 2026 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.