Qt之深入理解gesture
来源:互联网 发布:cc攻击器源码 编辑:程序博客网 时间:2024/04/30 09:29
Qt之深入理解gesture
转自:http://www.thisisqt.com/forum/viewthread.php?tid=145
Qt最新的版本4.7中有五个gesture,分别是QPanGesture, QPinchGesture, QSwipeGesture, QTapAndHoldGesture, and QTapGesture, 前三个比较常用,但用过的人仍然很少,很多人人对这个gesture意思感觉也陌生,更不用说对说出他们之间的区别了。这里我先解释一下:
Pan Gesture就是指一个手指在屏幕上滑动,当滑动距离超过一定大小时就产生了一个Pan Gesture的事件了,如下图所示:
Pinch Gesture就是两指放在屏幕上,靠近或者远离,就像捏东西一样,如下图所示:
Swipe Gesture就是一个手指在屏幕上沿着一个固定的方向滑动,滑动一段距离时就产生了一个Swipe Gesture的事件,如下图所示:
QTapAndHoldGesture和QTapGesture比较简单这里我就偷个懒不说了,哈哈。
Gesture是个手势,但是个组合拳,过滤Gesture是消耗很大的,一般来说它要过滤好几个事件,要与你要截获的Gesture对比,看有没有可能是你要的那个手势,如果所有事件都会做很多无用功,因此只有真的我们需要截获那个gesture时才会让系统帮我们这么做。
我比较喜欢看源码说事,就来看看
每个gesture都有对应的gesture recognizer(手势识别类)来识别这个gesture,比如QPanGesture,它就有QPanGestureRecognizer。可有了gesture recognizer,系统就认识你这个gesture了吗?不是,你还要将你的gesture recognizer注册到QGestureManager中,而QGestureManager则统一管理所有的gesture recognizer,系统只要通过QGestureManager就可以来识别相应的gesture。让我们来看看QGestureManager的构造函数源码:复制代码上面的代码很简单这里我只简单说说,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来过滤。
整个过程事件传递如下图所示:
Pan Gesture就是指一个手指在屏幕上滑动,当滑动距离超过一定大小时就产生了一个Pan Gesture的事件了,如下图所示:
Pinch Gesture就是两指放在屏幕上,靠近或者远离,就像捏东西一样,如下图所示:
Swipe Gesture就是一个手指在屏幕上沿着一个固定的方向滑动,滑动一段距离时就产生了一个Swipe Gesture的事件,如下图所示:
QTapAndHoldGesture和QTapGesture比较简单这里我就偷个懒不说了,哈哈。
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函数:
- Qt::GestureType QGestureManager::registerGestureRecognizer(QGestureRecognizer *recognizer)
- {
- //这里也用你的recognizer创建一个你的gesture实例,如果没有创建成功就
- //返回Qt::GestureType(0),表示注册失败
- QGesture *dummy = recognizer->create(0);
- if (!dummy) {
- qWarning("QGestureManager::registerGestureRecognizer: "
- "the recognizer fails to create a gesture object, skipping registration.");
- return Qt::GestureType(0);
- }
- //Code A
- //这里如果发现你的gestureType是CustomGesture则会
- //返回Qt::GestureType(Qt::CustomGesture + m_lastCustomGestureId)
- //即在Qt::CustomGesture基础上加一个数字,如果是注册第一个的自定义的gesture,
- //这里的m_lastCustomGestureId就是1,再注册就加2,以此类推
- //这里对我们理解自定义gesture很有帮助:)
- Qt::GestureType type = dummy->gestureType();
- if (type == Qt::CustomGesture) {
- // generate a new custom gesture id
- ++m_lastCustomGestureId;
- type = Qt::GestureType(Qt::CustomGesture + m_lastCustomGestureId);
- }
- m_recognizers.insertMulti(type, recognizer);
- delete dummy;
- return type;
- }
说完这些,让我们来看看有关gesture的事件传递的过程:
当你通过调用QWidget::grabGesture来截获相应的gesture手势时
如果你想截获某个手势,你需要调用QWidget::grabGesture方法来截获相应的手势类型,我们来看看QWidget::grabGesture方法源码:
- void QWidget::grabGesture(Qt::GestureType gesture, Qt::GestureFlags flags)
- {
- Q_D(QWidget);
- //这里先向gestureContext,即手势上下文,插入这个gesture类型
- //gestureContext是属于这个widget的QWidgetPrivate的,可见这里的截获事件紧限于这个widget
- d->gestureContext.insert(gesture, flags);
- // 创建gesture manager,这里用的是单例模式,哈哈
- (void)QGestureManager::instance();
- }
整个过程事件传递如下图所示:
- Qt之深入理解gesture
- Qt之深入理解gesture
- Qt之深入理解gesture
- QT之深入理解QThread
- QT之深入理解QThread
- Qt之QThread(深入理解)
- 深入理解Qt多线程
- Android之Gesture
- HashMap之深入理解
- border之深入理解
- CoordinatorLayout 之深入理解
- Qt深入理解信号与槽
- 【Qt开发】深入理解connect函数
- Gesture
- Gesture
- 深入理解PHP之OpCode
- 深入理解PHP之OpCode
- 深入理解PHP之OpCode
- 使用Google Page Speed
- QTP学习仍在继续
- 阐述Linux动态库的显式调用
- 用Doctype激活浏览器模式(Activating Browser Modes with Doctype) (五)
- foreach 语句用于循环遍历数组
- Qt之深入理解gesture
- Windows CE API大全
- [转]word只能用安全模式才能打开怎么解决
- ZedGraph控件的使用--属性和例子代码
- Android 读取已知包名的uses-permission
- 人生感悟:成功人需要具有的几种大气
- 基于Geoserver的WFS服务与Openlayers实现地理查询
- 中医养生四个基本原则
- 執行緒已中止/正在中止線程