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
抖音 : 茶山日记
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值