欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > 【QT ScrollArea】手势滑动ScrollArea窗口实现

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

2024/10/24 19:17:41 来源:https://blog.csdn.net/anmo_moan/article/details/139614525  浏览:    关键词:【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,垂直手势滑动为verticalScrollBarresult_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   ===============================

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com