【QT ScrollArea】手势滑动ScrollArea窗口实现

前言

   在使用QT 开发嵌入式类产品的UI交互界面时,我们常用到ScrollArea滑动窗口类。而该滑动窗口类默认只能通过点击拖动滑动窗口的滑动条,来实现窗口的水平或者垂直方向的滑动。
   本文提供了通过重写鼠标点击相关事件的函数来实现手势滑动的功能接口,以供参考

1. 头文件

  在关于定义ScrollArea窗口的类头文件中添加以下变量以及鼠标相关函数,该类继承QWidget或者QDialog基类

	int mouseMove_count;//记录屏幕坐标滑动偏移量
    int last_xPos;		//记录上一次屏幕悬停的坐标
    int current_xPos;	//记录当前屏幕悬停的坐标
    int result_xPos;	//计算滑动条最终所需滑动目的坐标
    void mouseMoveEvent(QMouseEvent *e) override;    //鼠标点击滑动事件
    void mouseReleaseEvent(QMouseEvent *e) override; //鼠标释放事件

  以下是一个添加的示例

#ifndef GESTURESLIDEWDGT_H
#define GESTURESLIDEWDGT_H
#include <QDialog>
#include <QScrollArea>
#include <QMouseEvent>
#include <QScrollBar>

namespace Ui {
    class GestureSlideWdgt;
}

class GestureSlideWdgt : public QDialog
{
    Q_OBJECT
public:
    explicit GestureSlideWdgt(QWidget *parent = nullptr);
    ~GestureSlideWdgt();

	//=================Beginning 这里是在定义滑动窗口的类中需要添加的变量和函数===============
    int mouseMove_count;
    int last_xPos;
    int current_xPos;
    int result_xPos;
    void mouseMoveEvent(QMouseEvent *e) override;
    void mouseReleaseEvent(QMouseEvent *e) override;
    //=====================================   end   =======================================

};

#endif

2. 源文件

  在对应的源文件中,初始化坐标相关变量,重写所添加的鼠标点击滑动与鼠标释放的函数,

/*
(1)在你的窗口类的构造函数的实现中,对在头文件中添加的变量【mouseMove_count】【last_xPos】【current_xPos】【result_xPos】进行初始化。
*/
GestureSlideWdgt::GestureSlideWdgt(QWidget *parent) :
    QDialog(parent),
    mouseMove_count(0),
    last_xPos(0),
    current_xPos(0),
    result_xPos(0)
{
	

}

GestureSlideWdgt::~HeadCardSideWdgt()
{

}

/*
(2)添加鼠标点击滑动与鼠标释放的函数具体实现
*/
//====================================   Beginning   =============================
void GestureSlideWdgt::mouseReleaseEvent_handle(QMouseEvent *e)
{
    Q_UNUSED(e);
    last_xPos = 0;//每次屏幕滑动释放,将上一次记录的坐标重置,否则将会回到上一次滑动的位置
}

void GestureSlideWdgt::mouseMoveEvent_handle(QMouseEvent *e)
{
    if(HeadCardSideWdgt::btnHeadCardSide_flag)
    {
        if( (e->y() > 610) && (e->x() < 1130) )//可限定滑动窗口的手势滑动有效区域
        {
            if(last_xPos == 0)//过滤水平滑动条的X坐标为0的情况,给上一次坐标记录重新赋值,避免无法滑动
            {
                last_xPos  = e->x();
                return ;
            }
            current_xPos = e->x();						//记录当前点击坐标的位置
            mouseMove_count = current_xPos - last_xPos;//计算屏幕滑动坐标偏移量
            last_xPos = current_xPos;				   //更新上一次坐标的记录

            if(mouseMove_count > 0)
            {
            	//计算滑动窗口水平滑动条移动的目标坐标,
            	//水平手势滑动为horizontalScrollBar,垂直手势滑动为verticalScrollBar
                result_xPos = this->pocketLab_ScrollArea->horizontalScrollBar()->value() - mouseMove_count;
            }else{
                result_xPos = this->pocketLab_ScrollArea->horizontalScrollBar()->value() + (~mouseMove_count);
            }
            this->pocketLab_ScrollArea->horizontalScrollBar()->setValue(result_xPos); //1000);

        }
    }

}
//======================================   END   ===============================

相关推荐

  1. 【QT ScrollArea手势滑动ScrollArea窗口实现

    2024-06-12 18:10:03       9 阅读
  2. 分布式限流——Redis + Lua实现滑动窗口算法

    2024-06-12 18:10:03       14 阅读
  3. 滑动窗口(单调队列)

    2024-06-12 18:10:03       44 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-12 18:10:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-12 18:10:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-12 18:10:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-12 18:10:03       20 阅读

热门阅读

  1. 聊聊对Andorid的FileProvider的理解

    2024-06-12 18:10:03       7 阅读
  2. Unity Mirror VR联机开发 房间篇

    2024-06-12 18:10:03       6 阅读
  3. uniapp怎么进行页面的跳转

    2024-06-12 18:10:03       6 阅读
  4. MIPI DSI to DP/eDP

    2024-06-12 18:10:03       7 阅读
  5. 初阶 《函数》 6. 函数的声明和定义

    2024-06-12 18:10:03       6 阅读
  6. 适用于Windows的MySQL安装程序介绍

    2024-06-12 18:10:03       8 阅读
  7. 非递归式实现快速排序

    2024-06-12 18:10:03       6 阅读
  8. ######## redis各章节终篇索引(更新中) ############

    2024-06-12 18:10:03       8 阅读
  9. chrome 您的连接不是私密连接

    2024-06-12 18:10:03       7 阅读
  10. VS Code1.90发布,VS Code speech与AI结合太强了

    2024-06-12 18:10:03       6 阅读