(五)Qt 动态手势识别“左右滑动”以及实现翻页效果

这篇具有很好参考价值的文章主要介绍了(五)Qt 动态手势识别“左右滑动”以及实现翻页效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

通过Qt实现手势识别控制软件操作相关系列技术方案

(一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现
(二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果
(三)Qt 动态手势识别“握拳”
(四)Qt 动态手势识别“手掌随动”+“握拳选择”
(五)Qt 动态手势识别“左右滑动”以及实现翻页效果


1、前言

  本系列博客为Qt实现动态手势识别以及实现一些特定效果的工程性记录博客。

1.1 目标

  本篇博客主要记录了动态手势识别实现“左右滑动翻页”的效果的过程。


2、效果

  为了实现对“左右滑动手势”现象的监测,首先设计好UI相关内容,即在Widget背景内实现“变色”的效果,且每当监测到“右移”或是“左移”的动作时,背景内的数字产生变化,每次“右移”发生时,背景的数字将会+1,每次“左移”发生时,背景的数字将会-1。
  数字右侧的窗口是摄像头的实时画面情况,用于验证效果。

  先看演示效果视频:

动态手势识别_左移页面_视角1

动态手势识别_右移页面_视角1

动态手势识别_右移页面_视角2

  效果演示动态图如下图所示:
(五)Qt 动态手势识别“左右滑动”以及实现翻页效果

图1 “右移”效果gif图

(五)Qt 动态手势识别“左右滑动”以及实现翻页效果

图2 “左移”效果gif图

2、代码实现

2.1 动态手势识别“左右滑动”

  判断动态手势的“左右滑动”,与本系列里第(三)篇文章里所说的“检测握拳动作”类似,均为实现判断某一特定系列内各帧静态手势的具体类别、相对位置、运动速度等具体参数内容。
  能判断手势是否存在“左右滑动”现象的手法很多,这里只介绍一种简单的方法步骤:
  (1)判定动作初始帧的位置,如果想右移,那么初始帧的位置必然位于监测画面的左半边,如果想左移,那么初始帧的位置必然位于监测画面的右半边(当然了,这里没什么必然,看个人对动态手势的具体定义吧);
  (2)检测该动作序列中,后一帧对前一帧在横坐标方向上的偏移量,若是右移,那么偏移量均应该为正值,若为左移,偏移量均应该为负值;
  (3)该序列每帧数据的纵坐标方向上的偏差应该小于某一特定的阈值,用于判断该动作是水平方向上的运动;
  (4)手势的速度问题,在上述第(2)点的偏移量,需要检测每个偏移量的数值大小,其绝对值应该大于某一特定的数值(这个自行确定);
  (5)最后一帧的位置问题,判断最后一帧的具体位置是否出现在其应该出现的位置,对于左移而言,其最后一帧的位置应该在监测画面的右半边。
  下面是识别“左右滑动”的算法的C++/Qt代码实现。

QString HandPostureDetect::dynamic_gesture_recognize_leftSlide(const QQueue<QPointF>* historyPoints)
{
    int countLeftMove = 0; 
    int countTotalPoints = historyPoints->size(); 

    const QPointF& startPoint = (*historyPoints).front();
    const QPointF& endPoint = (*historyPoints).back();

    double distance = qSqrt(qPow(endPoint.x() - startPoint.x(), 2) + qPow(endPoint.y() - startPoint.y(), 2));

    if (distance < 0.3 || startPoint.x() < 0.5)
    {
        pre_left_slide_condition = 0;
        return ""; 
    }

    for (int i = 1; i < countTotalPoints; ++i)
    {
        const QPointF& currentPoint = (*historyPoints)[i];
        const QPointF& previousPoint = (*historyPoints)[i - 1];

        double deltaX = currentPoint.x() - previousPoint.x();
        double deltaY = currentPoint.y() - previousPoint.y();

        if (deltaX < 0 && qAbs(deltaY) < 0.1) 
        {
            countLeftMove++;
        }
    }

    double ratioLeftMove = static_cast<double>(countLeftMove) / countTotalPoints;
    if (ratioLeftMove >= 0.3) 
    {
        if (pre_left_slide_condition == 0)
        {
            qDebug() << "Left Slide_" << left_slide_count;
            left_slide_count++;
            emit send_result(3);
        }
        pre_left_slide_condition = 1;
        return "Left Slide";
    }
    else
    {
        pre_left_slide_condition = 0;
        return "";
    }
}

2.2 屏幕滑动效果的实现

  通过QStackWidget模块实现容纳多个不同的QWidget对象,可进行按索引选择所展现的具体页面。
  这里“左右切换屏幕”的效果用Qt的动画模块QPropertyAnimation进行的实现。
  当每次有动态手势被检测到的时候,同时调用Interface_Switching_Animation函数,该函数包含两个参数,第一个参数int m_currentIndex用来表示QStackWidget的索引数,第二个参数int left_right_type用来表示是“左移”还是“右移”。

void Widget::Interface_Switching_Animation(int m_currentIndex, int left_right_type)
void Widget::Interface_Switching_Animation(int m_currentIndex, int left_right_type)
{
    int flag = 0;

    QLabel *m_label = new QLabel(ui->stackedWidget);
    m_label->resize(QSize(ui->stackedWidget->width(),ui->stackedWidget->height()));
    m_label->setPixmap(ui->stackedWidget->grab());
    m_label->setAttribute(Qt::WA_DeleteOnClose);
    m_label->show();

    QPropertyAnimation *animation1 = new QPropertyAnimation(m_label, "geometry");
    animation1->setDuration(1000);

    if(left_right_type == 1)
    {
        //向左拉出前一页
        animation1->setStartValue(QRect(0,0,ui->stackedWidget->width(),ui->stackedWidget->height()));
        animation1->setEndValue(QRect(ui->stackedWidget->width()*2,0,ui->stackedWidget->width(),ui->stackedWidget->height()));
        flag = 0;
    }

    else if(left_right_type == 0)
    {
        //向右拉出前一页
        animation1->setStartValue(QRect(0,0,ui->stackedWidget->width(),ui->stackedWidget->height()));
        animation1->setEndValue(QRect(-ui->stackedWidget->width()*2,0,ui->stackedWidget->width(),ui->stackedWidget->height()));
        flag = 1;
    }


    animation1->setEasingCurve(QEasingCurve::InCubic);

    QParallelAnimationGroup *group = new QParallelAnimationGroup;
    group->addAnimation(animation1);
    group->start(QAbstractAnimation::DeleteWhenStopped);

    ui->stackedWidget->setCurrentIndex(m_currentIndex);
    m_label->raise();
    connect(group, &QParallelAnimationGroup::finished, this, [=](){m_label->close();}); //关闭动画完成后关闭label

    if(flag == 0)
    {
        count_times++;
    }
    else if (flag == 1)
    {
        count_times--;
    }

    QString text = QString::number(count_times);
    QString styleSheet = "background-color: #";
    styleSheet += QString::number(qrand() % 256, 16).rightJustified(2, '0'); // 随机生成颜色
    styleSheet += QString::number(qrand() % 256, 16).rightJustified(2, '0');
    styleSheet += QString::number(qrand() % 256, 16).rightJustified(2, '0');

    QWidget* currentwidget = ui->stackedWidget->currentWidget();
    currentwidget->setStyleSheet(styleSheet);

    QLabel *label = new QLabel(currentwidget);
    label->setFont(QFont("Arial", 360));
    label->setText(text);
    label->setAlignment(Qt::AlignCenter);
    label->setGeometry(currentwidget->rect());
//        label->setStyleSheet("color: white;");
    label->show();
}

总结

  本系列文章,通过动、静态手势识别技术方式操控Qt界面软件实现相关操作功能:
(一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现
(二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果
(三)Qt 动态手势识别“握拳”
(四)Qt 动态手势识别“手掌随动”+“握拳选择”
(五)Qt 动态手势识别“左右滑动”以及实现翻页效果

  本项目所有代码的获取,请私信与本人联系。文章来源地址https://www.toymoban.com/news/detail-513585.html

到了这里,关于(五)Qt 动态手势识别“左右滑动”以及实现翻页效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【小程序】小程序如何实现滑动翻页(类似刷短视频的交互效果)

    在微信小程序中实现上下滑动翻页的效果其实非常简单,可以说一学就会。 这篇文章将非常详细地教大家如何实现这一交互: 首先我们在 Page 的 data 属性中添加两个变量: 其中 biases 是个数组,我们要实现的效果就是每次展示 biases 的一个元素,上划切换到上一个元素,下划

    2024年02月10日
    浏览(26)
  • 微信小程序、uniapp使用touchstart和touchmove左右滑动删除。以及解决上下抖动问题。

    展示效果图直接上代码 如果要修改里面内容直接从content这个类修改就行。 直接复制粘贴就行。拿上直接用。 如果遇到滑动会导致上下抖动用这个解决。给最外层得一个view标签加一个样式。 这样的话滑动会有阴影,但不会抖动,可以尝试一下看看,如果哪位能人能解决,就

    2024年02月11日
    浏览(105)
  • 微信小程序在ios端上下左右滑动以及底部滚动条的解决方案

    最近在写小程序,碰到一个非常棘手的问题,就是安卓没事,苹果手机上的页面能上下左右的滑动,不美观这里我理解为不兼容,本着有问题就去解决,苹果默认应该是滑动的,下面是解决方法 底部滚动条解决

    2024年02月04日
    浏览(99)
  • python+opencv+mediapipe实现手势检测上下左右(含完整代码)

    应用场景:ai换脸,根据左右手势选择图片,上下则表示选中。 版本号:python3.7(一开始是3.6,但是mediapipe最低就是3.7 因为网上检测的都不太准,所以我在判断的时候加入了如果70次里55次检测的是左才返回左,测试完之后效果还可以,蛮准的。判断方法想的头都要秃了。 实

    2024年04月11日
    浏览(37)
  • vue + element 实现鼠标左右滑动效果

    我用了element中的走马灯+overflow-x: auto; html (复制后格式化一下) js this.$refs.entrance.setActiveItem(index); 手动切换当前展示的索引

    2024年02月04日
    浏览(26)
  • Android——禁止ViewPager的左右滑动功能实现

    Android——禁止ViewPager的左右滑动功能实现 在Android开发中,ViewPager是一种常用的滑动控件,用于实现页面的左右切换效果。然而,在某些场景中,我们可能需要禁止ViewPager的左右滑动功能,只允许通过其他方式进行页面切换。本文将介绍如何在Android中实现禁止ViewPager左右滑动

    2024年02月06日
    浏览(34)
  • uniapp小程序—实现下滑关闭抽屉(包含上下左右滑动)

    操作:点击相应文字时从底部出现弹框,下滑超过一定速率,弹框回到下方隐藏; 这个组件有些多余的地方我没删,可以自行扩展。以下附带移动端的上下左右滑动,可以借鉴实现小程序的左右滑动

    2024年02月13日
    浏览(36)
  • 微信小程序实现左右滑动进行切换数据页面(touchmove)

    手指触摸左右滑动进行切换数据 需要实现的是有一个tab栏,点选某一个tab的时候切换页面,手势滑动,左滑右滑效果和点击tab一样切换页面数据。 这里我们要先了解几个微信的事件属性 touchstart : 手指触摸动作开始 touchmove:手指触摸后移动 touchcancel:手指触摸动作被打断,

    2024年02月11日
    浏览(40)
  • 【uniapp小程序】使用swiper实现页面内部左右滑动的切换

    具体效果:手指在页面左右滑动会切换tab  背景:项目里原有代码复制,去除一些功能,只留一个外壳,目的是为了以后套套套 代码: 注意:scroll-view标签内实现上来加载、下来刷新。因为现在页面用不到,所以并没有保留

    2024年02月12日
    浏览(36)
  • uniapp 微信小程序实现监听屏幕左右滑动实现tab标签切换效果

            实际的项目开发之中,有很多所谓的奇葩需求,当工程量相对较大的时候去更换组件会显得特别麻烦和费时。我这次的需求因为某些特殊原因,更换组件后也无法实现需要达到的效果,所以最后只能监听滑动事件,相信你看了我的代码也能轻松搞定!          

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包