• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

c++ - ios上的QGestures

[复制链接]
菜鸟教程小白 发表于 2022-12-12 23:48:20 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试在 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

#include "swipestackwidget.h"

#include <QDebug>

SwipeStackWidget::SwipeStackWidget(QWidget *parent) :
    QStackedWidget(parent)
{
    setAttribute(Qt::WA_AcceptTouchEvents);
    grabGesture(Qt::TapGesture);
    grabGesture(Qt::TapAndHoldGesture);
    grabGesture(Qt:anGesture);
    grabGesture(Qt:inchGesture);
    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:anGesture))
        qDebug() << "an";
    if (QGesture *pinch = event->gesture(Qt:inchGesture))
        qDebug() << "inch";
    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:eft) {
            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();
    }
}

我可以编译代码并在 iphone 上执行它。我确实收到了标签手势和 tabAndHold 可靠。 Pan 和 Pimch 有时确实会出现。滑动是个大问题:

  1. 它只出现在 3 个手指上
  2. 仅在向下或向右滑动时出现
  3. 它只是偶尔出现
  4. 滑动到底部有时被识别为下一个,有时被识别为向左

有没有人在 ios 上使用 QGestures 的经验可以帮助我?

我的测试类直接在主窗口中使用,我也在主窗口中使用了 grabGestures 命令,但我不在那里处理手势。



Best Answer-推荐答案


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

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

在 iOS SDK 中,一些基本手势类可针对手指数量和方向进行配置。 Read more.这只是相关的,因为这意味着如果 Qt 订阅了原生手势,Qt 可以轻松配置 Qt 订阅的原生手势。您可以查看 Qt 的代码(用于 iOS 平台抽象 QPA 和其他与手势相关的代码),以验证他们为滑动设计了 3 个手指(这不是错误。)

但iOS平台上的三指向上滑动物理手势应该是“隐藏应用程序并显示系统托盘”吗? (这是我的经验,我不能引用 iOS HIG,也不知道 App Store 需要什么。)如果是这样,那么应用应该订阅 Qt 的滑动手势并遵循指南。

但是你也可以在 Qt 中实现一个识别器来单指滑动?

关于c++ - ios上的QGestures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24725088/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap