在目前的嵌入式领域,Qt 被普遍应用于GUI的设计中。
手势识别做为移动设备必不可少的技术,Qt对手势也提供了一些支持。
Qt主要为用户提供了以下几种手势:
Tap,Press,Swipe,Pan,pinch五种手势,这五种手势是Qt原生的,具体的应用在网上有许多例子,这里就不多说了。
Qt支持的五种手势比较单一,可以满足基本的应用,但是对于一些复杂的手势支持起来就显得力不从心了。比如说对多指手势的支持。
但是Qt提供了一套很好的机制来,支持手势等基它功能的扩展,这就是plugin.
Qt 支持插件形式的功能扩展,现在我们就来说说怎么样用plugin来扩展Qt的手势。
1、Qt原生手势的机制是怎么样实现的:
1、通过分析Qt源码可以得知每个Qt手势都有两个必须的类:
一个是继承QGesture的类,另一个是继承QGestureRecognizer类,第一个是手势本身的类,第二个是手势识别器的类。
Qt的每种手势都会向手势识别器注册,然后手势识别器通过算法不识别哪种手势。
2、手势的扩展过程
因此我们要想扩展一个手势,也需要写两个这样的类:一个你要扩展的手势,另一个就是你这个手势的识别器。
例如: 我们要扩展的手势:Tap2,我们就要写下面两个类:
1、class Tap2 : public QGesture
{
//里面可以封装一些你想要的数据比如坐标,手指数等,也可以封装一些方法。
}
2、class Tap2Recognizer :: QGestureRecognizer
{
QGesture *create(QObject *);
QGestureRecognizer::Result recognize(QGesture *state, QObject *watched, QEvent *event);
void reset(QGesture *state);
}
我们需要重新写这个父类里的三个方法:
1、 QGesture *create(QObject *)//f创建一个手势类对像。并返回。这里是Tap2
{
return new Tap2;
}
2、 QGestureRecognizer::Result recognize(QGesture *state, QObject *watched, QEvent *event)
{
//state强转成你的手势类
//event强转成QTouchEvent
//主要识别手势的算法。
}
3、 void reset(QGesture *state)
{
//把手势的类的数据恢复到初始值。
}
2、QTouchEvent类的相关说明:
这个可以自己看Qt的相关文档,这里主要要就明的就是它的三个类型:
1、TouchBegin //手指与触摸屏开始接触时
2、TouchUpdate //手指与触摸屏接触过程中
3、TouchEnd //手指离开触摸屏
每种手势都有这三个类型,我们可以把它理解为不同的状态,具体在哪个状态里面来实现你自己的手势算法就要你自己去决定了。
3、QGestureRecognizer::Result 的说明:
QGestureRecognizer::CancelGesture //取消一个手势的识别,当前条件不满足算法时,可以调用,然后会调用reset().
QGestureRecognizer::FinishGesture //一个手势识别完成。手势识别完成,会调用reset()
QGestureRecognizer::MaybeGesture //这个手识可能是你要识别的手势。不会调reset()
QGestureRecognizer::TriggerGesture //一个手势被触发 //不会调reset.
3、手势plugin:
1、Qt的plugin有一个完整的规则,大家可以去Qt 源码中去了解.那怎么把你写的手势加载进你写的plugin中呢?首先我们要写一个类,
比如:class GestureDone
{
QGestureRecognizer::registerRecognizer(new Tap2GestureRecognizer)
}
然后我们在这个类的构造函数中对每一个手势进行注册。
最后我们在plugin中来生成这个类的对像,这样我们的手势就可以被加载到plugin中了。
4、扩展手势的使用:
扩展出来的手势和Qt原手手势在使用时并没有什么区别。
只是在手势类型和手势类的转换时要注意用我们扩展的名字和类就可以了。