QTableView 实现滑动功能
演示效果
在触摸屏 平板电脑 工控机的场景需要使用滑动功能
代码实现
customtabview.h头文件
#ifndef CUSTOMTABVIEW_H
#define CUSTOMTABVIEW_H
#include <QTableView>
#include <QEnterEvent>
#include <QMouseEvent>
#include <QTimer>
class CustomTabView : public QTableView
{
Q_OBJECT
public:
explicit CustomTabView(QWidget *parent = nullptr);
virtual ~CustomTabView();
void moveScrollBar(const int &moveVlue=0);
public slots:
void slots_timeOut();
protected:
void mousePressEvent(QMouseEvent *event);//按下事件,记录坐标和按下标志
void mouseReleaseEvent(QMouseEvent *event);//抬起事件,取消按下标志
void mouseMoveEvent(QMouseEvent *event);//鼠标移动事件,移动曲线
private:
QTimer m_Timer;
QPoint m_StartPoint;
QPoint m_LsatPoint;
QList<int> m_dataList;
int m_SlideCount;
bool m_IsUpDown;
qint64 m_lastST;
};
#endif // CUSTOMTABVIEW_H
customtabview.cpp文件
#include "customtabview.h"
#include <QMouseEvent>
#include <QDebug>
#include <QToolTip>
#include <QScrollBar>
#include "qmath.h"
#include <QDateTime>
CustomTabView::CustomTabView(QWidget *parent) : QTableView(parent)
{
//不设置这个不会触发鼠标悬浮移动事件
this->setMouseTracking(true);
connect(&m_Timer,&QTimer::timeout,this,&CustomTabView::slots_timeOut);
}
CustomTabView::~CustomTabView()
{
}
void CustomTabView::moveScrollBar(const int &moveVlue)
{
QScrollBar *ScrollBar;
ScrollBar=this->verticalScrollBar();
if(ScrollBar->value()<=ScrollBar->maximum()&&ScrollBar->value()>=ScrollBar->minimum())
{
ScrollBar->setValue(ScrollBar->value()+moveVlue);
}
// qDebug()<<"moveVlue"<<moveVlue<<ScrollBar->value();
}
void CustomTabView::slots_timeOut()
{
m_SlideCount-=1;
if(m_IsUpDown){
moveScrollBar(m_SlideCount);
}else{
moveScrollBar(m_SlideCount*-1);
}
// qDebug()<<m_SlideCount<<m_SlideCount<<m_IsUpDown;
if(m_SlideCount>=2){
m_Timer.start(2);
}else{
m_Timer.stop();
}
}
void CustomTabView::mousePressEvent(QMouseEvent *event)
{
if(m_Timer.isActive()){
m_Timer.stop();
}
m_StartPoint=event->pos();
m_LsatPoint=m_StartPoint;
m_dataList.clear();
m_lastST=QDateTime::currentMSecsSinceEpoch();
QTableView::mousePressEvent(event);
this->setSelectionMode(NoSelection);
}
void CustomTabView::mouseReleaseEvent(QMouseEvent *event)
{
this->setSelectionMode(ExtendedSelection);
if(m_dataList.count()!=0)
{
m_SlideCount=0;
int max=-65535;
int min=65535;
for(int i=0;i<m_dataList.count();i++){
if(min>m_dataList.at(i)){
min=m_dataList.at(i);
}
if(max<m_dataList.at(i)){
max=m_dataList.at(i);
}
}
if(qAbs(max-min)>3){
if(max<0){
m_IsUpDown=true;
}else{
m_IsUpDown=false;
}
m_SlideCount=qAbs(max-min);
m_Timer.start(0);
}
//qDebug()<<m_SlideCount<<max<<min<<m_IsUpDown;
m_dataList.clear();
//qDebug()<<"mouseReleaseEvent"<<m_SlideCount<<max<<min<<m_IsUpDown;
}
QTableView::mouseReleaseEvent(event);
}
void CustomTabView::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons()==Qt::LeftButton)
{
QPoint currPoint=event->pos();
int spanY=qAbs(currPoint.y()-m_StartPoint.y());
int moveY=currPoint.y()-m_LsatPoint.y();
m_LsatPoint=currPoint;
if(spanY>=2)
{
moveScrollBar(moveY*-1);
}
qint64 currentTime=QDateTime::currentMSecsSinceEpoch();
//qDebug()<<"mouseReleaseEvent"<<currentTime-m_lastST<<m_dataList.count();
if((currentTime-m_lastST)>50)
{
m_dataList.clear();
}else{
if(m_dataList.count()<5){
m_dataList.append(moveY);
}else{
m_dataList.removeFirst();
m_dataList.append(moveY);
}
}
m_lastST=currentTime;
}
QTableView::mouseMoveEvent(event);
}
解压带货
博主回家发展茶叶,自己种茶做茶,需要茶叶和一些咨询简单(博主自己有能力解决的)技术问题朋友可以咨询博主。
微信 : chashanrj
抖音 : 茶山日记