QGeoPositionInfoSource 类
QGeoPositionInfoSource 类是一个用于分发位置更新的抽象基类。更多信息...
头文件 | #include <QGeoPositionInfoSource> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Positioning) target_link_libraries(mytarget PRIVATE Qt6::Positioning) |
qmake | QT += positioning |
继承关系 | QObject |
继承自 |
公共类型
枚举 | Error { AccessError, ClosedError, NoError, UnknownSourceError, UpdateTimeoutError } |
枚举 | PositioningMethod { NoPositioningMethods, SatellitePositioningMethods, NonSatellitePositioningMethods, AllPositioningMethods } |
标志集 | PositioningMethods |
属性
- minimumUpdateInterval : const int
- preferredPositioningMethods : PositioningMethods
- sourceName : const 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) |
(自Qt 5.12起) void | supportedPositioningMethodsChanged() |
静态公开成员
QStringList | availableSources() |
QGeoPositionInfoSource * | createDefaultSource(QObject *parent) |
(自Qt 5.14起) QGeoPositionInfoSource * | createDefaultSource(const QVariantMap ¶meters, QObject *parent) |
QGeoPositionInfoSource * | createSource(const QString &sourceName, QObject *parent) |
(自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);
要删除先前设置的更新间隔,请使用值为 0 的 setUpdateInterval() 调用。
注意:位置源可能对更新间隔有最小值要求,如 minimumUpdateInterval() 返回的。
注意:要从 Android 服务中使用此类,请参阅 Android 上的 Qt 定位。
成员类型文档
枚举 QGeoPositionInfoSource::Error
Error 枚举表示可能发生的错误。
常量 | 值 | 描述 |
---|---|---|
QGeoPositionInfoSource::AccessError | 0 | 由于应用程序缺少所需权限,连接到远程定位后端的设置失败。 |
QGeoPositionInfoSource::ClosedError | 1 | 远程定位后端关闭了连接,例如当用户切换到关闭位置服务时。位置服务重新启用后,将立即恢复常规更新。 |
QGeoPositionInfoSource::NoError | 3 | 没有发生错误。 |
QGeoPositionInfoSource::UnknownSourceError | 2 | 发生了未识别的错误。 |
QGeoPositionInfoSource::UpdateTimeoutError (自 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 细胞识别符或基于 WiFi 的定位。 |
QGeoPositionInfoSource::AllPositioningMethods | 0xffffffff | 一旦可用即基于卫星的定位方法。否则使用非卫星方法。 |
PositioningMethods 类型是 QFlags<PositioningMethod> 的 typedef。它存储了 PositioningMethod 值的 OR 组合。
属性文档
[只读]
minimumUpdateInterval : const int
此属性持有检索位置更新的所需最小时间(以毫秒为单位)。
这是 setUpdateInterval() 和 requestUpdate() 接受的最小值。
访问函数
virtual int | minimumUpdateInterval() const = 0 |
[可绑定]
preferredPositioningMethods : PositioningMethods
注意:此属性支持 QProperty 绑定。
设置此源的首选定位方法。
如果新的方法包括一个源不支持的方法,则忽略不支持的方法。
如果新的方法不包含源可用/支持的单个方法,则首选方法将设置为源可用的方法集。如果源没有可用方法(例如,因为其位置服务已关闭或它不提供位置服务),则接受传入的方法。
此属性的默认值为 NoPositioningMethods。
注意:子类实现必须调用 setPreferredPositioningMethods()
的基本实现,以确保 preferredPositioningMethods()
返回正确的值。
另请参阅:supportedPositioningMethods。
[只读]
sourceName : const QString
此属性持有使用中的位置源实现的唯一名称。
这是可以传递给 createSource() 以创建特定位置源实例的相同名称。
访问函数
QString | sourceName() 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 ¶meters, 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 ¶meters, 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 返回的值,则发出带有 UpdateTimeoutError 的 errorOccurred() 信号。
如果超时时间为零,则默认为根据源适当设置的合理超时周期。
如果另一个更新请求正在进行,则此操作不会执行任何操作。但是,即使已经调用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 | 当位置服务处于活动状态时,知道并传达了个人提供商的状态和通用位置服务状态。 |
GeoClue | Always returns AllPositioningMethods hardcoded. |
GeoClue2 | 不可区分个人提供商,但反映已禁用的位置服务。 |
iOS | Always returns AllPositioningMethods hardcoded. |
macOS | Always 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. 在芬兰和/或其他国家的商标。所有其他商标均为其各自所有者的财产。