前言
在使用QT 开发嵌入式类产品的UI交互界面时,我们常用到ScrollArea滑动窗口类。而该滑动窗口类默认只能通过点击拖动滑动窗口的滑动条,来实现窗口的水平或者垂直方向的滑动。
本文提供了通过重写鼠标点击相关事件的函数来实现手势滑动的功能接口,以供参考
1. 头文件
在关于定义ScrollArea窗口的类头文件中添加以下变量以及鼠标相关函数,该类继承QWidget或者QDialog基类
cpp
int mouseMove_count;//记录屏幕坐标滑动偏移量
int last_xPos; //记录上一次屏幕悬停的坐标
int current_xPos; //记录当前屏幕悬停的坐标
int result_xPos; //计算滑动条最终所需滑动目的坐标
void mouseMoveEvent(QMouseEvent *e) override; //鼠标点击滑动事件
void mouseReleaseEvent(QMouseEvent *e) override; //鼠标释放事件
以下是一个添加的示例
cpp
#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. 源文件
在对应的源文件中,初始化坐标相关变量,重写所添加的鼠标点击滑动与鼠标释放的函数,
cpp
/*
(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 ===============================