一、前景介绍
在我们用Qt进行Android应用开发的时候,免不了要对一些设备的传感器或者收回进行监测。比如摇晃手机、翻转手机、接电话时等等。QSensor为我们的开发提供了便利,让我们能够获取到这些信息和手势,从而进行我们对应的处理。
二、传感器和传感器手势
传感器相关的类(如QGyroscope)可以获取到传感器的信息,比如陀螺仪、线性加速度等等,但通常情况下我们不需要自己来处理这些信息,除非你有特殊的需要。然后你得研究一大堆,比如这些传感器到底是干啥的,这些值获取过来有什么用,可能会涉及到物理知识(反正我是不太懂,获取到那些值后一脸懵逼哈哈)。通常情况下,我们只需要处理传感器手势就能够满足需求了。
传感器手势则可以识别移动设备的某个特定动作,比如摇晃手机(摇一摇)、翻转手机等。Qt没有针对每个手势提供对应的类,而都是用的QSensorGesture这个类,并且在使用前要先获取手势列表,然后再创建手势对象。所以我个人认为,获取到的手势列表取决于你的设备支持哪些手势,在获取列表时我们就能知道我们能处理哪些手势,然后再针对我们感兴趣的手势去做相应的处理(我在Qt文档中没有找到相关的说明,全凭自己臆测哈哈,如果有错欢迎指正!)。
本文只说如何使用,不详细介绍每种传感器和传感器手势,因为说起来太多也太复杂了(其实是我自己都还没搞懂哈哈>_<)
三、传感器的使用
1. 首先,不管是传感器还是传感器手势,你都需要在pro文件中写上这一句,添入sensors模块:
QT += sensors
2. 包含对应的头文件,以QGyroscope为例:
#include <QGyroscope>
3. 获取传感器状态:
QGyroscope* m_gyroscope = new QGyroscope(this);
QGyroscopeReading* m_gyro_reader = nullptr;
connect(m_gyroscope, SIGNAL(readingChanged()), this, SLOT(onGyroReadingChanged()));
m_gyroscope->start();
//处理函数
void SensorWidget::onGyroReadingChanged()
{
m_gyro_reader = m_gyroscope->reading();
qDebug() << "Phone's X gyroscope = " << (m_gyro_reader->x());
qDebug() << "Phone's Y gyroscope = " << (m_gyro_reader->y());
qDebug() << "Phone's Z gyroscope = " << (m_gyro_reader->z());
//doSomething();
}
4. 特别注意
想要实时获取传感器状态不要用线程,这样会出错,要用readingChanged()信号来获取 。
四、传感器手势的使用
1. 添加sensors模块
QT += sensors
2. 包含头文件:
#include <QSensorGesture>
#include <QSensorGestureManager>
3. 声明三个变量及初始化
QSensorGestureManager* m_gesture_manager = new QSensorGestureManager;
QStringList m_ges_list = m_gesture_manager->gestureIds();
QSensorGesture* m_cover_gesture = nullptr;
1) m_gesture_manager是管理这些手势的,可以用它来获取手势列表
2) m_ges_list用来接收手势列表
3) m_cover_gesture表示cover手势,因为不确定运行此程序的设备是否有该手势,所以初始化先置为空
4. 监测手势并处理:
if(m_ges_list.contains("QtSensors.cover"))
{
m_cover_gesture = new QSensorGesture(QStringList("QtSensors.cover"), this); //若手势列表中包含此手势,为它声明变量
connect(m_cover_gesture, SIGNAL(cover()), this, SLOT(onCover())); //声明一个槽函数,将其连接
if(m_cover_gesture)m_cover_gesture->startDetection();
}
//处理函数
void SensorWidget::onCover()
{
//doSomething();
}
1) 首先检查这个设备的手势列表是否包含cover手势;
2) 如果有的话为cover手势new一个QSensorGesture类型的对象;
3) 将cover手势的信号与其对应的处理槽函数连接,设备只要检测到cover手势就会出发该信号;
4) 调用QSensorGesture类的startDetection()函数监测cover手势的状态。
5. 特别注意
1) 通常情况下,手势都有与其名字相同的信号,比如上面的QtSensors.cover手势,就有一个cover()信号;
2) 极个别的手势没有与其名字对应的信号,比如QtSensor.twist,也没有twist()信号,但是它有twistLeft()和twistRight()这两
个信号;
3) 再比如QtSensor.shake2,也没有shake2()信号,这时可以用通用的信号名:detected()来与它的槽函数连接。
五、总结
传感器与传感器手势的使用基本就是这样,我们可以用它们来使用移动APP中很多亮眼的功能,增加用户的使用体验。但我们一般不需要直接处理传感器信号,除非有特殊需求而传感器手势又不能满足的时候,到时候你还得好好研究一下传感器!!
~~~好了,到这里就全部说完了,希望本文能够有用。同时如果有错误的话,可以悄悄告诉我哈哈。如果您有好的建议,请不吝赐教。