• 【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 
    #include 
    #include 
    #include 
    
    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   ===============================
    
  • 相关阅读:
    计算机网络 - 网络层
    网格切割算法
    【c++】c++类的大小的计算和this指针
    CSS基础
    计算机毕业设计Java厨艺交流平台(源码+系统+mysql数据库+lw文档)
    通付盾Web3专题 | SharkTeam:Web3安全实践与创新
    如何写出同事看不懂的Java代码?
    GitHub爬虫项目详解
    JSON数据和抛出异常
    Vue2利用创建a标签实现下载本地静态文件到本地电脑上的功能
  • 原文地址:https://blog.csdn.net/anmo_moan/article/details/139614525