Qt 自定义手势


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;
}

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值