C++ ios上的QQ手势

C++ ios上的QQ手势,c++,ios,qt,gesture,C++,Ios,Qt,Gesture,我尝试在ios上使用qt的手势,如下所示: #ifndef SWIPESTACKWIDGET_H #define SWIPESTACKWIDGET_H #include <QStackedWidget> #include <QSwipeGesture> class SwipeStackWidget : public QStackedWidget { Q_OBJECT public: explicit SwipeStackWidget(QWidget *pare

我尝试在ios上使用qt的手势,如下所示:

#ifndef SWIPESTACKWIDGET_H
#define SWIPESTACKWIDGET_H

#include <QStackedWidget>
#include <QSwipeGesture>

class SwipeStackWidget : public QStackedWidget
{
Q_OBJECT
public:
    explicit SwipeStackWidget(QWidget *parent = 0);

    bool event(QEvent *event);
    bool gestureEvent(QGestureEvent *event);
    void swipeTriggered(QSwipeGesture *gesture);
signals:

public slots:

};

#endif // SWIPESTACKWIDGET_H
\ifndef SWIPESTACKWIDGET\u H
#定义SWIPESTACKWIDGET_H
#包括
#包括
类SwipeStackWidget:publicqstackedwidget
{
Q_对象
公众:
显式SwipeStackWidget(QWidget*parent=0);
bool事件(QEvent*事件);
bool gestureEvent(QGestureEvent*事件);
无效开关切换(QSWIPESTERPORE*手势);
信号:
公众时段:
};
#endif//SWIPESTACKWIDGET_H

#包括“swipestackwidget.h”
#包括
SwipeStackWidget::SwipeStackWidget(QWidget*父项):
QStackedWidget(父级)
{
setAttribute(Qt::WA_AcceptTouchEvents);
抓取手势(Qt::tappostate);
抓取手势(Qt::TapandHold手势);
抓取手势(Qt::PanGesture);
抓取姿势(Qt::钳形感觉);
抓取手势(Qt::SwipeGesture);
}
bool SwipeStackWidget::事件(QEvent*事件)
{
如果(事件->类型()==QEvent::手势)
返回手势事件(静态施法(事件));
返回QWidget::事件(event);
}
bool SwipeStackWidget::gestureEvent(QGestureEvent*事件)
{
qDebug()手势(Qt::swipgesture))
滑动(静态施法(滑动));
if(qsignature*pan=event->signature(Qt::pangestrue))
qDebug()手势(Qt::PinchGesture))
qDebug()手势(Qt::Tap手势))
qDebug()手势(Qt::TapandHold手势))
qDebug()horizontalDirection()==QSwipe手势::左){
qDebug()horizontalDirection()==QSwipe手势::右){

qDebug()我可以确认它需要三个手指。我在iPad上用PyQt,Qt5.3.1进行了测试。(另外,pan需要两个手指。)

我怀疑Qt是这样设计的,所以它在不同平台上都是一样的(选择Ubuntu上常见的手指计数,因为Canonical可能贡献了大部分代码?)

在iOS SDK中,一些基本手势类可配置手指数和方向。这仅与此相关,因为这意味着Qt可以轻松配置Qt订阅的本机手势(如果他们订阅本机手势)。您可以查看Qt的代码(用于iOS平台抽象QPA和其他手势相关代码)以验证他们设计了3个手指用于刷卡(这不是一个bug)

但在iOS平台上,3个手指向上滑动的物理手势应该意味着“隐藏应用程序并显示系统托盘”?(这是我的经验,我不能引用iOS HIG,也不知道应用商店需要什么。)如果是这样,那么应用程序应该订阅Qt的滑动手势并遵循指导原则

但是你也可以在Qt中实现一个识别器,用一个手指滑动

#include "swipestackwidget.h"

#include <QDebug>

SwipeStackWidget::SwipeStackWidget(QWidget *parent) :
    QStackedWidget(parent)
{
    setAttribute(Qt::WA_AcceptTouchEvents);
    grabGesture(Qt::TapGesture);
    grabGesture(Qt::TapAndHoldGesture);
    grabGesture(Qt::PanGesture);
    grabGesture(Qt::PinchGesture);
    grabGesture(Qt::SwipeGesture);
}

bool SwipeStackWidget::event(QEvent *event)
{
    if (event->type() == QEvent::Gesture)
        return gestureEvent(static_cast<QGestureEvent*>(event));
    return QWidget::event(event);
}

bool SwipeStackWidget::gestureEvent(QGestureEvent *event)
{
    qDebug() << "gestureEvent():" << event->gestures().size();
    if (QGesture *swipe = event->gesture(Qt::SwipeGesture))
        swipeTriggered(static_cast<QSwipeGesture *>(swipe));
    if (QGesture *pan = event->gesture(Qt::PanGesture))
        qDebug() << "Pan";
    if (QGesture *pinch = event->gesture(Qt::PinchGesture))
        qDebug() << "Pinch";
    if (QGesture *pinch = event->gesture(Qt::TapGesture))
        qDebug() << "Tap";
    if (QGesture *pinch = event->gesture(Qt::TapAndHoldGesture))
        qDebug() << "Tapandhold";
    return true;
}

void SwipeStackWidget::swipeTriggered(QSwipeGesture *gesture)
{
    qDebug() << "swipeTriggered()";
    if (gesture->state() == Qt::GestureFinished) {
        if (gesture->horizontalDirection() == QSwipeGesture::Left) {
            qDebug() << "swipeTriggered(): swipe to previous";
            setCurrentIndex( std::max( 0, currentIndex()-1) );
        } else if (gesture->horizontalDirection() == QSwipeGesture::Right) {
            qDebug() << "swipeTriggered(): swipe to next";
            setCurrentIndex( std::min( count()-1, currentIndex()+1) );
        }
        update();
    }
}