Qt 主要为用户提供了以下集中手势:
QPanGesture // 平移(1个手指拖动)
QPinchGesture // 捏合缩放及缩放(2个手指捏合或转动)
QSwipeGesture // 滑动(3个手指平移)
QTapGesture // 点击(1个手指单击)
QTapAndHoldGesture // 点击并长按(1个手指单击并长按)
Qt支持的五中手势功能单一,可以满足基本的引用。但对一些较为复杂的手势交互就显得力不从心。
Qt为此提供了一套很好的机制,用来自定义我们自己的手势。
Qt原生手势的机制是如何实现的
每个Qt手势都有两个必须类:
QGesture // 手势类
QGestureRecognizer // 手势识别器类
Qt的每种手势都会向手势识别器注册,手势识别器通过算法识别具体是哪种手势。
如何自定义手势
我们如果需要自定义手势,同样需要自定义这两个类。
例如:我们需要自定义一个5点响应的手势:FiveTapGesture ,我们需要写以下两个类:
FiveTapGesture.h
#include <QGesture>
#include <QGestureRecognizer>
class FiveTapGesture: public QGesture
{
public:
FiveTapGesture(QObject *parent = 0);
// 封装手势需要实现的功能
};
class FiveTapGestureRecognizer : public QGestureRecognizer
{
public:
FiveTapGestureRecognizer();
private:
// 重载手势识别器的三个方法
virtual QGesture *create(QObject *target);
virtual Result recognize(QGesture *state, QObject *watched, QEvent *event);
virtual void reset(QGesture *state);
};
FiveTapGesture.cpp
#include "FiveTapGesture.h"
FiveTapGesture::FiveTapGesture(QObject *parent)
: QGesture{parent}
{
}
FiveTapGestureRecognizer::FiveTapGestureRecognizer() : QGestureRecognizer()
{
}
QGesture *FiveTapGestureRecognizer::create(QObject *target)
{
// 创建一个手势类对象并将其返回
return static_cast<QGesture *>(new FiveTapGesture());
}
QGestureRecognizer::Result FiveTapGestureRecognizer::recognize(QGesture *state, QObject *watched, QEvent *event)
{
// 主要识别手势的算法
if (event->type() == QEvent::TouchUpdate)
{
if (static_cast<QTouchEvent *>(event)->touchPoints().size() == 5)
{
return FinishGesture;
}
}
return Ignore;
}
void FiveTapGestureRecognizer::reset(QGesture *state)
{
// 把手势参数重置
}
QGestureRecognizer::Result 说明
QGestureRecognizer::CancelGesture // 取消一个手势的识别,当前条件不满足算法时,可以返回CancelGesture,返回之后将会调用 reset()
QGestureRecognizer::FinishGesture // 完成手势识别,返回后将会调用 resert()
QGestureRecognizer::MaybeGesture // 可能是你需要识别的手势,返回后不会调用 reset()
QGestureRecognizer::TriggerGesture // 手势被触发,返回后不会调用 reset()
将自定义的手势加载至Widget中
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 接收Touch事件
setAttribute(Qt::WA_AcceptTouchEvents);
mFiveGesture = new FiveTapGestureRecognizer();
mType = QGestureRecognizer::registerRecognizer(mFiveGesture);
// 注册手势事件
grabGesture(mType);
}
MainWindow::~MainWindow()
{
delete ui;
}
bool MainWindow::event(QEvent *event)
{
if (event->type() == QEvent::Gesture)
{
return gestureEvent(static_cast<QGestureEvent*>(event));
}
return QWidget::event(event);
}
bool MainWindow::gestureEvent(QGestureEvent *event)
{
if(QGesture *g = event->gesture(mType))
{
qDebug() <<__FUNCTION__<<__LINE__<<"FiveTapGesture Action";
event->accept(g);
}
return true;
}