QGeoPositionInfoSource 类

QGeoPositionInfoSource 类是一个用于分发位置更新的抽象基类。更多信息...

头文件 #include <QGeoPositionInfoSource>
CMakefind_package(Qt6 REQUIRED COMPONENTS Positioning)
target_link_libraries(mytarget PRIVATE Qt6::Positioning)
qmakeQT += positioning
继承关系 QObject
继承自

QNmeaPositionInfoSource

公共类型

枚举Error { AccessError, ClosedError, NoError, UnknownSourceError, UpdateTimeoutError }
枚举PositioningMethod { NoPositioningMethods, SatellitePositioningMethods, NonSatellitePositioningMethods, AllPositioningMethods }
标志集PositioningMethods

属性

公共函数

QGeoPositionInfoSource(QObject *parent)
virtual~QGeoPositionInfoSource()
(since Qt 5.14) virtual QVariantbackendProperty(const QString &name) const
QBindable<QGeoPositionInfoSource::PositioningMethods>bindablePreferredPositioningMethods()
QBindable<int>bindableUpdateInterval()
virtual QGeoPositionInfoSource::Errorerror() const = 0
virtual QGeoPositionInfolastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const = 0
virtual intminimumUpdateInterval() const = 0
QGeoPositionInfoSource::PositioningMethodspreferredPositioningMethods() const
(since Qt 5.14) virtual boolsetBackendProperty(const QString &name, const QVariant &value)
virtual voidsetPreferredPositioningMethods(QGeoPositionInfoSource::PositioningMethods methods)
virtual voidsetUpdateInterval(int msec)
QStringsourceName() const
virtual QGeoPositionInfoSource::PositioningMethodssupportedPositioningMethods() const = 0
intupdateInterval() const

公共槽函数

virtual voidrequestUpdate(int timeout = 0) = 0
virtual voidstartUpdates() = 0
virtual voidstopUpdates() = 0

信号

voiderrorOccurred(QGeoPositionInfoSource::Error positioningError)
voidpositionUpdated(const QGeoPositionInfo &update)
(自Qt 5.12起) voidsupportedPositioningMethodsChanged()

静态公开成员

QStringListavailableSources()
QGeoPositionInfoSource *createDefaultSource(QObject *parent)
(自Qt 5.14起) QGeoPositionInfoSource *createDefaultSource(const QVariantMap &parameters, QObject *parent)
QGeoPositionInfoSource *createSource(const QString &sourceName, QObject *parent)
(自Qt 5.14起) QGeoPositionInfoSource *createSource(const QString &sourceName, const QVariantMap &parameters, 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);

要删除先前设置的更新间隔,请使用值为 0 的 setUpdateInterval() 调用。

注意:位置源可能对更新间隔有最小值要求,如 minimumUpdateInterval() 返回的。

注意:要从 Android 服务中使用此类,请参阅 Android 上的 Qt 定位

成员类型文档

枚举 QGeoPositionInfoSource::Error

Error 枚举表示可能发生的错误。

常量描述
QGeoPositionInfoSource::AccessError0由于应用程序缺少所需权限,连接到远程定位后端的设置失败。
QGeoPositionInfoSource::ClosedError1远程定位后端关闭了连接,例如当用户切换到关闭位置服务时。位置服务重新启用后,将立即恢复常规更新。
QGeoPositionInfoSource::NoError3没有发生错误。
QGeoPositionInfoSource::UnknownSourceError2发生了未识别的错误。
QGeoPositionInfoSource::UpdateTimeoutError (自 Qt 6.2 起)4如果调用了 requestUpdate(),此错误表示无法在指定的超时时间内获取当前位置。如果调用了 startUpdates(),此错误表示此 QGeoPositionInfoSource 子类确定它将无法提供进一步的常规更新。在后一种情况下,直到常规更新恢复之后,将不会再发出错误。

enum QGeoPositionInfoSource::PositioningMethod
flags QGeoPositionInfoSource::PositioningMethods

定义了定位方法类型。

常量描述
QGeoPositionInfoSource::NoPositioningMethods0x00000000没有定位方法。
QGeoPositionInfoSource::SatellitePositioningMethods0x000000ff基于卫星的定位方法,如 GPS 或 GLONASS。
QGeoPositionInfoSource::NonSatellitePositioningMethods0xffffff00其他定位方法,如 3GPP 细胞识别符或基于 WiFi 的定位。
QGeoPositionInfoSource::AllPositioningMethods0xffffffff一旦可用即基于卫星的定位方法。否则使用非卫星方法。

PositioningMethods 类型是 QFlags<PositioningMethod> 的 typedef。它存储了 PositioningMethod 值的 OR 组合。

属性文档

[只读] minimumUpdateInterval : const int

此属性持有检索位置更新的所需最小时间(以毫秒为单位)。

这是 setUpdateInterval() 和 requestUpdate() 接受的最小值。

访问函数

virtual intminimumUpdateInterval() const = 0

[可绑定] preferredPositioningMethods : PositioningMethods

注意:此属性支持 QProperty 绑定。

设置此源的首选定位方法。

如果新的方法包括一个源不支持的方法,则忽略不支持的方法。

如果新的方法不包含源可用/支持的单个方法,则首选方法将设置为源可用的方法集。如果源没有可用方法(例如,因为其位置服务已关闭或它不提供位置服务),则接受传入的方法。

此属性的默认值为 NoPositioningMethods

注意:子类实现必须调用 setPreferredPositioningMethods() 的基本实现,以确保 preferredPositioningMethods() 返回正确的值。

另请参阅:supportedPositioningMethods

[只读] sourceName : const QString

此属性持有使用中的位置源实现的唯一名称。

这是可以传递给 createSource() 以创建特定位置源实例的相同名称。

访问函数

QStringsourceName() const

[可绑定] updateInterval : int

注意:此属性支持 QProperty 绑定。

此属性包含请求的更新间隔,单位为毫秒。

如果未设置更新间隔(或设置为0),则源将根据需要更新。

如果设置了更新间隔,源将尽可能以接近请求间隔的间隔提供更新。如果请求间隔小于minimumUpdateInterval(),则使用最小间隔。

更新间隔的更改将尽可能快地发生,但是不同实现之间的时间可能会有所不同。是否将上一个间隔的经过时间计为新间隔的部分也是实现依赖的。

此属性的默认值是0。

注意:子类实现必须调用基类的setUpdateInterval()方法,以便updateInterval()返回正确的值。

注意:此属性不能用于在iOS和macOS上调整更新频率,因为它们的API不提供此类功能。在这些系统中,此参数仅用于设置UpdateTimeoutError并在所需间隔内未接收到更新时触发errorOccurred信号。

成员函数文档

[显式] QGeoPositionInfoSource::QGeoPositionInfoSource(QObject *parent)

创建一个具有指定parent的位置源。

[虚,无异常] QGeoPositionInfoSource::~QGeoPositionInfoSource()

销毁位置源。

[静态] QStringList QGeoPositionInfoSource::availableSources()

返回一组可用源插件列表。这包括任何当前平台默认的后端插件。

[虚,自Qt 5.14起] QVariant QGeoPositionInfoSource::backendProperty(const QString &name) const

如果存在,返回名称为name的后端特定属性的值。否则,返回的值将是无效的。支持的后端特定属性列在其描述在Qt 定位插件 #默认插件中。

此函数是在Qt 5.14中引入的。

另请参阅setBackendProperty

[静态] QGeoPositionInfoSource *QGeoPositionInfoSource::createDefaultSource(QObject *parent)

创建并返回一个位置源,该源具有给定的parent,并从系统默认位置数据源读取或具有最高可用优先级的插件。

如果没有系统默认位置源、无法找到有效的插件或用户无权访问当前位置,则返回nullptr

[静态,自 Qt 5.14 开始] QGeoPositionInfoSource *QGeoPositionInfoSource::createDefaultSource(const QVariantMap &parameters, QObject *parent)

创建并返回一个位置源,该源具有给定的parent,并从系统默认位置数据源读取或具有最高可用优先级的插件。

如果没有系统默认位置源、无法找到有效的插件或用户无权访问当前位置,则返回nullptr

此方法将 parameters 传递给工厂以配置源。

此函数是在Qt 5.14中引入的。

[静态] QGeoPositionInfoSource *QGeoPositionInfoSource::createSource(const QString &sourceName, QObject *parent)

通过加载名为 sourceName 的插件,创建并返回一个指定 parent 的位置源。

如果找不到插件,则返回 nullptr

[静态,自 Qt 5.14 开始] QGeoPositionInfoSource *QGeoPositionInfoSource::createSource(const QString &sourceName, const QVariantMap &parameters, QObject *parent)

通过加载名为 sourceName 的插件,创建并返回一个指定 parent 的位置源。

如果找不到插件,则返回 nullptr

此方法将 parameters 传递给工厂以配置源。

此函数是在Qt 5.14中引入的。

[纯虚函数] QGeoPositionInfoSource::Error QGeoPositionInfoSource::error() const

返回最后一次发生的错误类型。

注意:自 Qt6 开始,在调用 startUpdates() 或 requestUpdate() 时总是重置最后一次错误。

[信号] void QGeoPositionInfoSource::errorOccurred(QGeoPositionInfoSource::Error positioningError)

发生错误后发出此信号。参数 positioningError 描述了发生的错误类型。

[纯虚函数] QGeoPositionInfo QGeoPositionInfoSource::lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const

返回包含最后一次已知位置的更新,如果没有则返回 null 更新。

如果 fromSatellitePositioningMethodsOnly 为 true,则此函数返回从卫星定位方法接收到的最后一个已知位置;如果没有,则返回 null 更新。

[信号] void QGeoPositionInfoSource::positionUpdated(const QGeoPositionInfo &update)

当调用 startUpdates() 或 requestUpdate() 时,如果有更新可用,则发出此信号。

参数 update 包含新更新的值。

[纯虚槽] void QGeoPositionInfoSource::requestUpdate(int timeout = 0)

尝试获取当前位置,并使用该信息发出 positionUpdated() 信号。如果在指定的 timeout(以毫秒为单位)内找不到当前位置,或者 timeout 小于由 minimumUpdateInterval 返回的值,则发出带有 UpdateTimeoutErrorerrorOccurred() 信号。

如果超时时间为零,则默认为根据源适当设置的合理超时周期。

如果另一个更新请求正在进行,则此操作不会执行任何操作。但是,即使已经调用startUpdates()并且常规更新正在进行,也可以调用此函数。

如果源使用多种定位方法,则会尝试在给定的超时时间内从最精确的定位方法中获取当前位置。

注意:从 Qt6 开始,在请求位置之前,此方法始终将最后一个错误重置为NoError

注意:要从 Android 服务中使用此方法,请参阅Qt 位置信息在 Android 上的使用。

[虚拟,自 Qt 5.14 起使用] bool QGeoPositionInfoSource::setBackendProperty(const QString &name, const QVariant &value)

将名为 name 的后端特定属性设置为 value。如果成功返回 true,否则返回 false。后端特定属性可用于在运行时配置定位子系统的行为。支持的特定于后端的属性列于Qt 位置信息插件#默认插件中。

此函数是在Qt 5.14中引入的。

另请参阅:backendProperty

[纯虚拟槽] void QGeoPositionInfoSource::startUpdates()

以根据 setUpdateInterval 设置的间隔定期发出更新。

如果没有调用 setUpdateInterval(),则源将在更新变得可用时立即发出更新。

如果此 QGeoPositionInfoSource 子类确定它无法提供定期更新,则将发出 errorOccurred() 信号,其中包含 UpdateTimeoutError。这可能发生在丢失卫星修复或检测到硬件错误的情况下。如果稍后数据变得可用,则将重新启动位置更新。在定期更新恢复后,将再次发射 UpdateTimeoutError 错误。

注意:从 Qt6 开始,在开始更新之前,此方法始终将最后一个错误重置为 NoError

注意:要从 Android 服务中使用此方法,请参阅Qt 位置信息在 Android 上的使用。

在 iOS 上,从版本 8 开始,Core Location 框架需要在应用程序的 Info.plist 中添加额外的条目,键为 NSLocationAlwaysUsageDescription 或 NSLocationWhenInUseUsageDescription,并在授权提示中显示一个字符串。键 NSLocationWhenInUseUsageDescription 用于在应用程序处于前台时请求使用位置服务的权限。键 NSLocationAlwaysUsageDescription 用于在应用程序运行时请求使用位置服务的权限(既包括前台也包括后台)。如果都定义了这两个条目,则 NSLocationWhenInUseUsageDescription 在前台模式下具有优先级。

[纯虚拟槽] void QGeoPositionInfoSource::stopUpdates()

停止以固定间隔发出更新。

[纯虚拟] QGeoPositionInfoSource::PositioningMethods QGeoPositionInfoSource::supportedPositioningMethods() const

返回此源可用的定位方法。可用性定义为在调用此函数时可供使用。因此,用户设置(如关闭位置服务或限制卫星定位提供商)也会通过此函数反映出来。可以通过supportedPositioningMethodsChanged() 获取状态变化时的运行时通知。

并非所有平台都能区分不同的定位方法或传达设备的当前用户配置。下表概述了当前的平台情况

平台简要说明
Android当位置服务处于活动状态时,知道并传达了个人提供商的状态和通用位置服务状态。
GeoClueAlways returns AllPositioningMethods hardcoded.
GeoClue2不可区分个人提供商,但反映已禁用的位置服务。
iOSAlways returns AllPositioningMethods hardcoded.
macOSAlways returns AllPositioningMethods hardcoded.
Windows (UWP)不可区分个人提供商,但反映已禁用的位置服务。

另请参阅supportedPositioningMethodsChanged() 和 setPreferredPositioningMethods()。

[signal, since Qt 5.12] void QGeoPositionInfoSource::supportedPositioningMethodsChanged()

当支持定位方法更改时,会发出此信号。改变的原因可能是用户打开/关闭位置服务或限制位置服务到某些类型(例如,仅GPS)。请注意,并非所有平台都能检测到支持定位方法的变化。supportedPositioningMethods() 提供了当前平台支持的概述。

此函数在 Qt 5.12 中引入。

© 2024 The Qt Company Ltd. 本文档贡献的文档版权属于各自的拥有者。本提供的文档根据 Free Software Foundation 发布的 GNU Free Documentation License version 1.3 的条款分发。Qt 和相应标志是 The Qt Company Ltd. 在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。