Qt最新的版本4.7中有五个gesture,分别是QPanGesture,QPinchGesture,QSwipeGesture,QTapAndHoldGesture,and QTapGesture, 前三个比较常用,但用过的人仍然很少,很多人人对这个gesture意思感觉也陌生,更不用说对说出他们之间的区别了。这里我先解释一下:
Pan Gesture就是指一个手指在屏幕上滑动,当滑动距离超过一定大小时就产生了一个Pan Gesture的事件了,如下图所示:
Gesture是个手势,但是个组合拳,过滤Gesture是消耗很大的,一般来说它要过滤好几个事件,要与你要截获的Gesture对比,看有没有可能 是你要的那个手势,如果所有事件都会做很多无用功,因此只有真的我们需要截获那个gesture时才会让系统帮我们这么做。
我比较喜欢看源码说事,就来看看
每个gesture都有对应的gesture recognizer(手势识别类)来识别这个gesture,比如QPanGesture,它就有QPanGestureRecognizer。可有了 gesture recognizer,系统就认识你这个gesture了吗?不是,你还要将你的gesture recognizer注册到QGestureManager中,而QGestureManager则统一管理所有的gesture recognizer,系统只要通过QGestureManager就可以来识别相应的gesture。让我们来看看QGestureManager的构 造函数源码: QGestureManager::QGestureManager(QObject *parent ) : QObject(parent),state(NotGesture),m_lastCustomGestureID(0) { qRegisterMetaType<Qt::GestureState>(); #if defined(Q_WS_MAC) registerGestureRecognizer(new QMacSwipeGestureRecognizer); registerGestureRecognizer(new QMacPinchGestureRecognizer); #if defined(QT_MAC_USE_COCOA) registerGestureRecognizer(new QMacPanGestureRecognizer); #endif #else registerGestureRecognizer(new QPanGestureRecognizer); registerGestureRecognizer(new QPinchGestureRecognizer); registerGestureRecognizer(new QSwipeGestureRecognizer); registerGestureRecognizer(new QTapGestureRecognizer); #endif #if defined(Q_OS_WIN) #if !defined(QT_NO_NATIVE_GESTURES) if (QApplicationPrivate::HastouchSupport) registerGestureRecognizer(new QWinNativePanGestureRecognizer); #endif #else registerGestureRecognizer(new QTapAndHoldGestureRecognizer); #endif } 复制代码
上面的代码很简单这里我只简单说说,registerGestureRecognizer就是用来注册gesture recognizer的,刚开始说的五个gesture在这里都注册了。
我们再了看看registerGestureRecognizer函数:
上 面代码中注释的应该比较全,这里我只就Code A部分说一下,如果我自定义一个gesture时,无需管它的gesture类型,也不用重新实现它的gestureType方法,默认的就是 Qt::CustomGesture,这里的你的gesture类型ID你可以通过调用 QGestureRecognizer::registerRecognizer方法的返回值来获得,也可以根据上面的代码在 Qt::CustomGesture基础上加上相应的数字来得到。
说完这些,让我们来看看有关gesture的事件传递的过程:
当你通过调用QWidget ::grabGesture来截获相应的gesture手势时
如果你想截获某个手势,你需要调用QWidget::grabGesture方法来截获相应的手势类型,我们来看看QWidget::grabGesture方法源码:
这样之后,当事件最终通过经过QApplication::notify方法处理时,如果发现接受事件的wIDet有截获gesture时,就会将事件叫给gesture manager来过滤。
整个过程事件传递如下图所示:
以上是内存溢出为你收集整理的Qt之深入理解gesture全部内容,希望文章能够帮你解决Qt之深入理解gesture所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)