Qt 传感器 C++ 概述
传感器类型
在一个设备上可能有多种类型的传感器。Qt 传感器 API 支持的类型不一定都可用。也可能有类型可用,但没有在 Qt 传感器 API 中定义。可以使用 QSensor::sensorTypes() 函数找到设备上可用的传感器类型。
有关内置传感器类型的列表,请参阅下文中的 传感器类 部分。
常见约定
除非另有说明,否则 Qt 传感器使用 右手笛卡尔坐标系。
为了测量所有 6 个方向,使用负值。
如果在轴周围旋转,旋转应表示为右手旋转。
通常,传感器数据是以相对 QScreen::nativeOrientation 的方向 orientated,也就是说,当设备以自然方向持有时(通常当设备标志向上时),指向设备的顶部。如果要在屏幕上显示值,可能需要转换这些值,使它们与用户界面方向相匹配。传感器可以定义其数据是相对于 UI orientated 的。这将在传感器的文档中注明。
使用传感器
QSensor 的生命周期通常如下
- 在堆栈或堆上创建 QSensor 或其子类的实例。
- 根据需要设置应用程序。
- 开始接收值。
- 传感器数据由应用程序使用。
- 停止接收值。
以下是在堆和堆栈上创建传感器的示例。
// On the heap (deleted when this object is deleted) QAccelerometer *sensor = new QAccelerometer(this); // On the stack (deleted when the current scope ends) QOrientationSensor orient_sensor;
通用地访问传感器数据
处理传感器数据的首选方法是使用 Reading Classes。然而,有时这可能不可行。例如,你可能会将应用程序部署到具有新传感器类型的设备,但没有任何 C++ 标头描述读取类。
感谢 Qt 的属性系统,您仍然可以访问传感器数据。为了这样做,您需要知道以下三件事情
- 传感器类型。
- 属性名称或索引。
- 属性类型或可比较的类型。
例如,以下是如何访问加速度计属性的一个示例。此代码不需要将 QAccelerometer 或 QAccelerometerReading 链接到编译期间。
// start the sensor QSensor sensor("QAccelerometer"); sensor.start(); // later QSensorReading *reading = sensor.reading(); qreal x = reading->property("x").value<qreal>(); qreal y = reading->value(1).value<qreal>();
您也可以在运行时发现所有这些信息。
在运行时发现传感器和读取属性
有时在开发时可能无法知道可用的传感器。可以像下面所示找到哪些传感器可用
QList<QSensor*> mySensorList; for (const QByteArray &type : QSensor::sensorTypes()) { qDebug() << "Found a sensor type:" << type; for (const QByteArray &identifier : QSensor::sensorsForType(type)) { qDebug() << " " << "Found a sensor of that type:" << identifier; QSensor* sensor = new QSensor(type, this); sensor->setIdentifier(identifier); mySensorList.append(sensor); } }
此外,还可以发现这些传感器的读取细节,如下所示
for (QSensor* sensor : mySensorList) { const int firstProperty = QSensorReading::staticMetaObject.propertyOffset(); // Connect to backend first in case start() hasn't been called yet if (!sensor->connectToBackend()) continue; qDebug() << "Sensor" << sensor->identifier() << "reading properties:"; QSensorReading *reading = sensor->reading(); if (reading) { const QMetaObject *mo = reading->metaObject(); for (int i = firstProperty; i < mo->propertyCount(); ++i) { QByteArray name = mo->property(i).name(); qDebug() << " " << name << reading->property(name).toByteArray(); } } }
前端,后端
Qt传感器API有一个前端,为应用程序开发者使用,一个后端,在那里设备实现者编写代码以访问其硬件。虽然作为应用程序开发者您不需要访问后端,但了解它是如何工作可能会有所帮助。
来自应用程序的命令通过QSensor传递,然后传达到底层插件。数据通过QSensorReading类返回。
更多有关后端的信息可以参考Qt传感器后端。
主要类
组成Qt传感器API的顶级类。
表示单个硬件传感器 | |
高效回调机制,用于异步通知传感器变化 | |
存储传感器读取数据 |
读取类
通过这些类之一访问传感器数据是最佳方式。
报告沿X、Y和Z轴的线性加速度 | |
表示环境光传感器的读取 | |
存储环境温度的读取数据 | |
表示指南针的读取 | |
表示陀螺仪传感器的读取 | |
存储湿度传感器的读取数据 | |
代表光传感器的读取 | |
表示磁力计的读取 | |
代表方向传感器的读取 | |
存储气压传感器的读取数据 | |
代表接近传感器的读取 | |
代表旋转传感器的读取 | |
存储倾斜传感器的读取数据 |
传感器类
这些类提供了便利的包装器,减少了类型转换的需求。每个此类均代表Qt传感器API所知的传感器类型。请注意,在运行时可能会提供更多类型。有关更多信息,请参阅传感器类型。
QSensor的便利包装器 | |
QSensor的便利包装器 | |
QSensor的便利包装器 | |
QSensor的便利包装器 | |
QSensor的便利包装器 | |
QSensor的便利包装器 | |
QSensor的便利包装器 | |
QSensor的便利包装器 | |
QSensor的便利包装器 | |
QSensor的便利包装器 | |
QSensor的便利包装器 | |
QSensor的便利包装器 | |
QSensor的便利包装器 |
过滤器类
与传感器类一样,这些提供了便利的包装器,减少了类型转换的需求。
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 | |
QSensorFilter的便利包装器 |
© 2024 Qt公司有限。此处包含的文档贡献是各自所有者的版权。此处提供的文档根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款进行许可。Qt和相应的标志是芬兰及其它国家/地区Qt公司的商标。所有其他商标均为各自所有者的财产。