QGeoAreaMonitorSource Class
QGeoAreaMonitorSource 类可用于检测指定坐标集的邻近状态变化。更多内容...
| 头文件: | #include <QGeoAreaMonitorSource> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Positioning) target_link_libraries(mytarget PRIVATE Qt6::Positioning) |
| qmake: | QT += positioning |
| 继承自: | QObject |
公共类型
| enum | AreaMonitorFeature { PersistentAreaMonitorFeature, AnyAreaMonitorFeature } |
| flags | AreaMonitorFeatures |
| enum | Error { AccessError, InsufficientPositionInfo, NoError, UnknownSourceError } |
公共函数
| QGeoAreaMonitorSource(QObject *parent) | |
| virtual | ~QGeoAreaMonitorSource() |
| virtual QList<QGeoAreaMonitorInfo> | activeMonitors() const = 0 |
| virtual QList<QGeoAreaMonitorInfo> | activeMonitors(const QGeoShape &lookupArea) const = 0 |
(since 6.2) virtual QVariant | backendProperty(const QString &name) const |
| virtual QGeoAreaMonitorSource::Error | error() const = 0 |
| virtual QGeoPositionInfoSource * | positionInfoSource() const |
| virtual bool | requestUpdate(const QGeoAreaMonitorInfo &monitor, const char *signal) = 0 |
(since 6.2) virtual bool | setBackendProperty(const QString &name, const QVariant &value) |
| virtual void | setPositionInfoSource(QGeoPositionInfoSource *newSource) |
| QString | sourceName() const |
| virtual bool | startMonitoring(const QGeoAreaMonitorInfo &monitor) = 0 |
| virtual bool | stopMonitoring(const QGeoAreaMonitorInfo &monitor) = 0 |
| virtual QGeoAreaMonitorSource::AreaMonitorFeatures | supportedAreaMonitorFeatures() const = 0 |
信号
| void | areaEntered(const QGeoAreaMonitorInfo &monitor, const QGeoPositionInfo &update) |
| void | areaExited(const QGeoAreaMonitorInfo &monitor, const QGeoPositionInfo &update) |
| void | errorOccurred(QGeoAreaMonitorSource::Error areaMonitoringError) |
| void | monitorExpired(const QGeoAreaMonitorInfo &monitor) |
静态公共成员
| QStringList | availableSources() |
| QGeoAreaMonitorSource * | createDefaultSource(QObject *parent) |
| QGeoAreaMonitorSource * | createSource(const QString &sourceName, QObject *parent) |
详细说明
当当前位置处于指定区域的范围内,或已移出该范围时,QGeoAreaMonitorSource 会发出信号。每个区域由一个 `QGeoAreaMonitorInfo ` 对象指定。例如:
public:
MyClass() : QObject()
{
QGeoAreaMonitorSource*monitor =QGeoAreaMonitorSource::createDefaultSource(this);
if(monitor) {
connect(monitor,SIGNAL(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo)),
this,SLOT(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo)));
connect(monitor,SIGNAL(areaExited(QGeoAreaMonitorInfo,QGeoPositionInfo)),
this,SLOT(areaExited(QGeoAreaMonitorInfo,QGeoPositionInfo)));
QGeoAreaMonitorInfo bigBen("大本钟");
QGeoCoordinate position(51.50104,-0.124632);
bigBen.setArea(QGeoCircle(position, 100));
monitor->startMonitoring(bigBen);
}else{
qDebug() << "Could not create default area monitor";
}
}
publicQ_SLOTS:
voidareaEntered(constQGeoAreaMonitorInfo&mon, constQGeoPositionInfo&update)
{
Q_UNUSED(mon);
qDebug() << "Now within 100 meters, current position is" << update.coordinate();
}
voidareaExited(constQGeoAreaMonitorInfo&mon, constQGeoPositionInfo&update)
{
Q_UNUSED(mon);
qDebug() << "No longer within 100 meters, current position is" << update.coordinate();
}QGeoAreaMonitorSource 遵循单例模式。该类的每个实例(通过sourceName()创建)共享同一个区域监控后端。如果通过startMonitoring()或requestUpdate()添加了一个新的QGeoAreaMonitorInfo 对象,则该类的另一个实例可以获取该对象(前提是它们来自同一个区域监控提供程序插件)。 本类所使用的QGeoPositionInfoSource 实例也遵循相同的单例模式。以下代码片段突出了该行为:
QGeoAreaMonitorSource *s1 = QGeoAreaMonitorSource::createSource("blah", this);
QGeoAreaMonitorSource *s2 = QGeoAreaMonitorSource::createSource("blah", this);
QVERIFY(s1->positionInfoSource() == s2->positionInfoSource);成员类型文档
enum QGeoAreaMonitorSource::AreaMonitorFeature
flags QGeoAreaMonitorSource::AreaMonitorFeatures
定义了区域监测能力的类型。
| 常量 | 值 | 描述 |
|---|---|---|
QGeoAreaMonitorSource::PersistentAreaMonitorFeature | 0x00000001 | QGeoAreaMonitorInfo 实例可以设为持久化。即使管理该监控器的应用程序未运行,持久化监控器仍会保持活动状态。 |
QGeoAreaMonitorSource::AnyAreaMonitorFeature | 0xffffffff | 匹配所有可能的区域监控功能。 |
AreaMonitorFeatures 类型是QFlags<AreaMonitorFeature> 的 typedef 定义。它存储 AreaMonitorFeature 值的“或”组合。
enum QGeoAreaMonitorSource::Error
定义了定位方法的类型。
Error 枚举表示可能发生的错误。
| 常量 | 值 | 描述 |
|---|---|---|
QGeoAreaMonitorSource::AccessError | 0 | 由于应用程序缺乏所需的权限,与远程区域监控后端的连接建立失败。 |
QGeoAreaMonitorSource::InsufficientPositionInfo | 1 | 区域监控源无法检索到定位信息,或者定位精度不足以提供有效的区域监控。 |
QGeoAreaMonitorSource::NoError | 3 | 未发生任何错误。 |
QGeoAreaMonitorSource::UnknownSourceError | 2 | 发生了一个未识别的错误。 |
成员函数文档
[explicit] QGeoAreaMonitorSource::QGeoAreaMonitorSource(QObject *parent)
使用给定的parent 创建一个监视源。
[virtual noexcept] QGeoAreaMonitorSource::~QGeoAreaMonitorSource()
销毁监视器源。
[pure virtual] QList<QGeoAreaMonitorInfo> QGeoAreaMonitorSource::activeMonitors() const
返回QGeoAreaMonitorSource 对象所知的所有活动监视器的列表。
活动监视器是通过startMonitoring() 启动的。对于每个活动监视器,源对象都会发出相应的信号,例如areaEntered() 或areaExited()。同一应用程序中的多个QGeoAreaMonitorSource 实例共享相同的活动监视器对象。
除非活跃的QGeoAreaMonitorInfo 调用了isPersistent(),否则一旦当前应用程序终止,活跃的QGeoAreaMonitorInfo 将被停止。
[pure virtual] QList<QGeoAreaMonitorInfo> QGeoAreaMonitorSource::activeMonitors(const QGeoShape &lookupArea) const
返回QGeoAreaMonitorSource 对象所知的所有、中心位于lookupArea 范围内的活动监视器列表。如果lookupArea 为空,则返回的列表也为空。
活动监视器是通过startMonitoring() 启动的。对于每个活动监视器,源对象都会发出相应的信号,例如areaEntered() 或areaExited()。同一应用程序中的多个QGeoAreaMonitorSource 实例共享相同的活动监视器对象。
除非活跃的QGeoAreaMonitorInfo 调用了isPersistent(),否则活跃的QGeoAreaMonitorInfo 将在当前应用程序终止时停止运行。
另请参阅 QGeoShape 。
[signal] void QGeoAreaMonitorSource::areaEntered(const QGeoAreaMonitorInfo &monitor, const QGeoPositionInfo &update)
当当前位置从活动monitor 外的区域移动到被监控区域内时触发此事件。
update 保存了新位置。
[signal] void QGeoAreaMonitorSource::areaExited(const QGeoAreaMonitorInfo &monitor, const QGeoPositionInfo &update)
当当前位置从活动monitor 内的位置移动到监控区域外时触发。
update 中保存了新位置。
[static] QStringList QGeoAreaMonitorSource::availableSources()
返回一个包含可用监控插件的列表,其中包括系统默认后端(如果存在的话)。
[virtual, since 6.2] QVariant QGeoAreaMonitorSource::backendProperty(const QString &name) const
如果存在名为name 的后端特定属性,则返回该属性的值;否则,返回的值将无效。
该函数在 Qt 6.2 中引入。
另请参阅 setBackendProperty()。
[static] QGeoAreaMonitorSource *QGeoAreaMonitorSource::createDefaultSource(QObject *parent)
创建并返回一个监视源,该监视源具有给定的parent ,用于监视底层系统中使用资源的区域。
如果系统不支持位置监控,则返回nullptr 。
[static] QGeoAreaMonitorSource *QGeoAreaMonitorSource::createSource(const QString &sourceName, QObject *parent)
通过加载名为sourceName 的插件,创建并返回一个具有给定parent 的监视源。
如果找不到该插件,则返回nullptr 。
[pure virtual] QGeoAreaMonitorSource::Error QGeoAreaMonitorSource::error() const
返回上次发生的错误类型。
注意:自 Qt6起 ,在调用 `startMonitoring()` 或 `requestUpdate()` 时,最后一次错误总会重置。
[signal] void QGeoAreaMonitorSource::errorOccurred(QGeoAreaMonitorSource::Error areaMonitoringError)
该信号在发生错误后发出。areaMonitoringError 参数描述了发生的错误类型。
[signal] void QGeoAreaMonitorSource::monitorExpired(const QGeoAreaMonitorInfo &monitor)
当monitor 过期时触发。过期的区域监视器会自动从activeMonitors()列表中移除。
另请参阅 activeMonitors()。
[virtual] QGeoPositionInfoSource *QGeoAreaMonitorSource::positionInfoSource() const
返回此QGeoAreaMonitorSource 对象当前使用的QGeoPositionInfoSource 。如果未设置其他对象,该函数将返回QGeoPositionInfoSource::createDefaultSource()。
如果甚至不存在默认的QGeoPositionInfoSource ,该函数将返回nullptr 。
使用返回的QGeoPositionInfoSource 实例时,应考虑到它可能位于不同的线程中。
另请参阅 QGeoPositionInfoSource 和setPositionInfoSource()。
[pure virtual] bool QGeoAreaMonitorSource::requestUpdate(const QGeoAreaMonitorInfo &monitor, const char *signal)
启用单次触发区域监视。针对monitor 的区域监视将持续进行,直至该QGeoAreaMonitorSource 实例首次发出signal 信号。一旦信号发出,monitor 将自动从activeMonitors()列表中移除。如果monitor 无效或其到期日期已过,该函数将返回false 。
QGeoAreaMonitor singleShotMonitor;
QGeoAreaMonitorSource * source = QGeoAreaMonitorSource::createDefaultSource(this);
//...
bool ret = source->requestUpdate(singleShotMonitor,
SIGNAL(areaExited(QGeoAreaMonitor,QGeoPositionInfo)));上述singleShotMonitor 对象在首次发出areaExited() 信号后将停止发送更新。在此之前,其他任何信号均可根据区域上下文被发出零次或多次。
无法同时为同一个监视对象的多个信号请求更新。对该函数的最后一次调用将决定停止继续更新的信号。在此阶段,仅可使用areaEntered()和areaExited()信号来终止监视过程。
如果区域监视后端不支持 `QGeoAreaMonitorSource::PersistentAreaMonitorFeature`,则对 `QGeoAreaMonitorSource ` 实例请求持久监视将失败。
如果monitor 已经通过startMonitoring() 注册,则将其转换为单次触发行为。
注意:自 Qt6起 ,该方法在开始监控前会始终将最后一个错误重置为 `NoError `。
另请参阅 startMonitoring() 和stopMonitoring()。
[virtual, since 6.2] bool QGeoAreaMonitorSource::setBackendProperty(const QString &name, const QVariant &value)
将名为name 的后端特定属性设置为value 。成功时返回true ,否则返回false 。后端特定属性可用于在运行时配置区域监控子系统的行为。
该函数在 Qt 6.2 中引入。
另请参阅 backendProperty()。
[virtual] void QGeoAreaMonitorSource::setPositionInfoSource(QGeoPositionInfoSource *newSource)
设置此QGeoAreaMonitorSource 对象将使用的新QGeoPositionInfoSource 。该区域监控后端将成为newSource 的新QObject 父对象。之前的QGeoPositionInfoSource 对象将被删除。所有基于同一sourceName()的QGeoAreaMonitorSource 实例将共享同一个QGeoPositionInfoSource 实例。
当需要操作区域监控引擎所使用的定位系统时,这可能会很有用。
请注意,所有权必须由QGeoAreaMonitorSource 的子类负责管理。由于该类采用单例模式,newSource 可能会被移至新的线程中。
另请参阅 positionInfoSource()。
QString QGeoAreaMonitorSource::sourceName() const
返回当前正在使用的区域监视器源实现的唯一名称。
该名称与传递给createSource()以创建特定区域监视器源实现的新实例时所使用的名称相同。
[pure virtual] bool QGeoAreaMonitorSource::startMonitoring(const QGeoAreaMonitorInfo &monitor)
如果成功启动了对monitor 的监控,则返回true ;否则返回false 。无法启动监控的原因可能是:未通过setPositionInfoSource() 设置备用QGeoPositionInfoSource ,且没有可用的默认位置信息源。
如果monitor 已处于活动状态,现有的监控对象将被新的monitor 引用所替换。QGeoAreaMonitorInfo 实例的识别是通过QGeoAreaMonitorInfo::identifier()实现的。因此,该函数也可用于更新已活动的监控。
如果monitor 的过期日期已过,该函数将返回 false。对于已通过requestUpdate() 注册的单次监控,调用此函数将使监控切换为永久监控模式。
如果区域监控后端不支持QGeoAreaMonitorSource::PersistentAreaMonitorFeature ,则对QGeoAreaMonitorSource 实例请求持久监控将失败。
注意:自 Qt6起 ,该方法在开始监控前会始终将最后一个错误重置为NoError 。
另请参阅 stopMonitoring()。
[pure virtual] bool QGeoAreaMonitorSource::stopMonitoring(const QGeoAreaMonitorInfo &monitor)
如果已成功将monitor 从activeMonitors()列表中移除,则返回true;否则返回false。此行为与monitor 是通过startMonitoring()还是requestUpdate()注册的无关。
[pure virtual] QGeoAreaMonitorSource::AreaMonitorFeatures QGeoAreaMonitorSource::supportedAreaMonitorFeatures() const
返回该源可用的区域监控功能。
© 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.