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 的属性系统,您仍然可以访问传感器数据。为了这样做,您需要知道以下三件事情

  • 传感器类型。
  • 属性名称或索引。
  • 属性类型或可比较的类型。

例如,以下是如何访问加速度计属性的一个示例。此代码不需要将 QAccelerometerQAccelerometerReading 链接到编译期间。

// 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的顶级类。

QSensor

表示单个硬件传感器

QSensorFilter

高效回调机制,用于异步通知传感器变化

QSensorReading

存储传感器读取数据

读取类

通过这些类之一访问传感器数据是最佳方式。

QAccelerometerReading

报告沿X、Y和Z轴的线性加速度

QAmbientLightReading

表示环境光传感器的读取

QAmbientTemperatureReading

存储环境温度的读取数据

QCompassReading

表示指南针的读取

QGyroscopeReading

表示陀螺仪传感器的读取

QHumidityReading

存储湿度传感器的读取数据

QLightReading

代表光传感器的读取

QMagnetometerReading

表示磁力计的读取

QOrientationReading

代表方向传感器的读取

QPressureReading

存储气压传感器的读取数据

QProximityReading

代表接近传感器的读取

QRotationReading

代表旋转传感器的读取

QTiltReading

存储倾斜传感器的读取数据

传感器类

这些类提供了便利的包装器,减少了类型转换的需求。每个此类均代表Qt传感器API所知的传感器类型。请注意,在运行时可能会提供更多类型。有关更多信息,请参阅传感器类型

QAccelerometer

QSensor的便利包装器

QAmbientLightSensor

QSensor的便利包装器

QAmbientTemperatureSensor

QSensor的便利包装器

QCompass

QSensor的便利包装器

QGyroscope

QSensor的便利包装器

QHumiditySensor

QSensor的便利包装器

QLightSensor

QSensor的便利包装器

QMagnetometer

QSensor的便利包装器

QOrientationSensor

QSensor的便利包装器

QPressureSensor

QSensor的便利包装器

QProximitySensor

QSensor的便利包装器

QRotationSensor

QSensor的便利包装器

QTiltSensor

QSensor的便利包装器

过滤器类

与传感器类一样,这些提供了便利的包装器,减少了类型转换的需求。

QAccelerometerFilter

QSensorFilter的便利包装器

QAmbientLightFilter

QSensorFilter的便利包装器

QAmbientTemperatureFilter

QSensorFilter的便利包装器

QCompassFilter

QSensorFilter的便利包装器

QGyroscopeFilter

QSensorFilter的便利包装器

QHumidityFilter

QSensorFilter的便利包装器

QLightFilter

QSensorFilter的便利包装器

QMagnetometerFilter

QSensorFilter的便利包装器

QOrientationFilter

QSensorFilter的便利包装器

QPressureFilter

QSensorFilter的便利包装器

QProximityFilter

QSensorFilter的便利包装器

QRotationFilter

QSensorFilter的便利包装器

QTiltFilter

QSensorFilter的便利包装器

© 2024 Qt公司有限。此处包含的文档贡献是各自所有者的版权。此处提供的文档根据自由软件基金会发布的GNU自由文档许可协议版本1.3的条款进行许可。Qt和相应的标志是芬兰及其它国家/地区Qt公司的商标。所有其他商标均为各自所有者的财产。