效果

头文件:

#ifndef CustomScroll_H
#define CustomScroll_H#include <QObject>
#include <QWidget>
#include <QTimer>
#include <QTableView>
#include <QPropertyAnimation>
#include <QDateTime>class CustomScroll : public QWidget
{Q_OBJECT
#define SHOW_ROWS 10    //表格固定显示的行数
#define SCROL_WIDTH 10     //滚动条宽度
#define SCROL_CLOLOR QColor(150,150,150,140)
#define SCROL_SHOW_TIME 2000typedef enum tagLuiScrollMouseDragInfo {MOUSE_RELEASE = 0,          //鼠标离开MOUSE_PRESS = 1,            //按下MOUSE_PRESS_MOVE = 2,       //按下+移动MOUSE_RELEASE_MOVE = 3      //鼠标 离开 并 滑动}LUI_Scroll_Mouse_Drag_INFO_E;LUI_Scroll_Mouse_Drag_INFO_E m_dragFlag;public:explicit CustomScroll(QTableView* table,QWidget *parent = NULL);public slots:void scrollTimeOut();
private:bool eventFilter(QObject *obj, QEvent *evt);QTimer m_scrollTimer;       //用于控制右侧滚动条的显示QTableView *m_table;        //构造函数传入的表格指针QScrollBar *m_scrollBar;    //指向表格滚动条QPropertyAnimation *animation;  //属性动画,使用动画驱动表格滑动int  m_selectRow;int  m_srcollH;
};#endif // CustomScroll_H

cpp文件

#include "customscroll.h"
#include <QMouseEvent>
#include <QDebug>
#include <QApplication>
#include <QPainter>
#include <QTableWidget>
#include <QHeaderView>
#include <QScrollBar>
#include <QAbstractAnimation>CustomScroll::CustomScroll(QTableView* table,QWidget *parent) :QWidget(parent),m_dragFlag(MOUSE_RELEASE)
{setAttribute(Qt::WA_TranslucentBackground);m_scrollBar = table->verticalScrollBar();m_scrollBar->hide();connect(m_scrollBar,&QScrollBar::sliderPressed,[=](){ m_scrollTimer.stop(); });           //按下滚动条connect(m_scrollBar,&QScrollBar::sliderMoved,[=](){ m_scrollTimer.stop(); });connect(m_scrollBar,&QScrollBar::sliderReleased,[=](){ m_scrollTimer.start(SCROL_SHOW_TIME); });     //松开滚动条animation = new QPropertyAnimation(m_scrollBar,"value",this);       //创建动画对象connect(animation,&QPropertyAnimation::finished,[=](){          //动画结束后启动定时器准备隐藏滚动条m_scrollTimer.start(SCROL_SHOW_TIME);});connect(&m_scrollTimer,SIGNAL(timeout()),this,SLOT(scrollTimeOut()));m_table = table;m_table->viewport()->installEventFilter(this);  //安装事件过滤器m_table->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);this->resize(SCROL_WIDTH,m_table->height());this->move(0,5);            //将滑动条移至最右侧this->raise();      //置顶父窗口m_srcollH  = m_table->height();
}void CustomScroll::scrollTimeOut()
{m_scrollBar->hide();m_dragFlag = MOUSE_RELEASE;
}bool CustomScroll::eventFilter(QObject *obj, QEvent *evt)
{static int pressPoint_y   = 0;      //记录按下位置static int dragPoint_y    = -1;     //拖动位置static qint64 pressMSec ;           //记录按下的时间点int scrollV_max = m_scrollBar->maximum ();int scrollV_min = m_scrollBar->minimum ();QMouseEvent *mouse =  dynamic_cast<QMouseEvent *>(evt);if(mouse){//=================== 按下 ===========================if( mouse->type() ==QEvent::MouseButtonPress){m_scrollTimer.stop();m_scrollBar->show();pressMSec = QDateTime::currentDateTime().toMSecsSinceEpoch();     //记录按下的时间dragPoint_y  = mouse->pos().y();               //当前坐标pressPoint_y = dragPoint_y;                      //按下的位置animation->stop();m_selectRow = m_table->indexAt(mouse->pos()).row();    //选择当前行m_dragFlag = MOUSE_PRESS;}//======================= 只点击了一下屏幕,未移动 =============================else if(mouse->type() == QEvent::MouseButtonRelease && m_dragFlag == MOUSE_PRESS){m_dragFlag = MOUSE_RELEASE;m_scrollTimer.start(SCROL_SHOW_TIME);  //2S后取消滑动条显示m_scrollBar->show();}//==================== 鼠标移动 ==============================else if((m_dragFlag!= MOUSE_RELEASE) && mouse->type() == QEvent::MouseMove){if(m_dragFlag == MOUSE_PRESS)     //鼠标按下到现在的滑动状态,即表示首次滑动{if(qAbs(dragPoint_y - mouse->pos().y()) < 5)   //判断移动阀值,避免误操作return true;else{m_dragFlag = MOUSE_PRESS_MOVE;           //转为移动状态m_table->clearSelection();               //已经移动了,所以取消之前的选择dragPoint_y = mouse->pos().y();          //获取当前坐标return true;}}int moveValue = (dragPoint_y - mouse->pos().y()) + m_scrollBar->value(); //移动值 + 滚动条当前值 = 滑动到的位置dragPoint_y = mouse->pos().y();m_table->clearSelection();if(scrollV_min > moveValue) moveValue = scrollV_min;    //添加位置限制if(moveValue > scrollV_max) moveValue = scrollV_max;m_scrollBar->setValue(moveValue);   //表格显示到对应位置}//======================= 从按下滑动状态 到现在 鼠标松开,惯性滑动 =============================else if(m_dragFlag == MOUSE_PRESS_MOVE && mouse->type() == QEvent::MouseButtonRelease){dragPoint_y = -1;int releasePoint_y = mouse->pos().y();int ms= QDateTime::currentDateTime().toMSecsSinceEpoch()-pressMSec;int Pixel_per_second=qAbs(releasePoint_y - pressPoint_y)*1000/ms;       //计算每秒像素点if(Pixel_per_second < 300 || qAbs(releasePoint_y - pressPoint_y) < 45){m_dragFlag = MOUSE_RELEASE;return true;}else{int moveValue;if(ms > 1000)      //滑动的时间不能超过1s{m_dragFlag = MOUSE_RELEASE;return true;}//计算滑动得到的位置if(releasePoint_y - pressPoint_y > 0)     //向下滑动{moveValue = m_scrollBar->value() - Pixel_per_second*0.2*(300/ms);   //滑动时间越长,moveValue值越小,因为不是快速滑动if(moveValue < scrollV_min)moveValue = scrollV_min;}else{moveValue = m_scrollBar->value() + Pixel_per_second*0.2*(300/ms);if(moveValue > scrollV_max)moveValue = scrollV_max;}m_table->clearSelection();//滑动松开后惯性滑动动画animation->setDuration(2000-ms);animation->setEndValue(moveValue);animation->setEasingCurve(QEasingCurve::OutQuart);animation->start();m_dragFlag = MOUSE_RELEASE_MOVE;    //鼠标松开,惯性滑动状态}}}return QWidget::eventFilter(obj,evt);
}

使用方法

    CustomScroll *tableMove;tableMove = new CustomScroll(ui->tableView,this);

qtableView初始化建议

    ui->tableView->verticalHeader()->setVisible(false);     //隐藏序号列ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //设置点击选择方式,行、列、单元格ui->tableView->setSelectionMode(QAbstractItemView::MultiSelection); //设置可选择条目数ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);  //内容不可编辑ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);   //设置表头不可拖动ui->tableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //去掉水平滚动条//ui->tableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //去掉垂直滚动条

建议滚动条样式

    //设置纵向滚动条样式ui->tableView->verticalScrollBar()->setStyleSheet("QScrollBar{""background:white;"//背景色"width:20px;""QScrollBar::sub-line{background:transparent;}"   //向上箭头样式"QScrollBar::add-line{background:transparent;}"   //向下箭头样式"}""QScrollBar::handle{" //滑块样式"background:#d0d0d0; ""border:2px solid transparent;""border-radius:10px;""hover{background:#d0d0d0;}""}""QScrollBar::handle:vertical:hover{background:#a0a0a0;}" //鼠标触及滑块样式-滑块颜色);

QtableView点击滑动设计相关推荐

  1. python写一个自动登录脚本_Python 实现自动登录+点击+滑动验证功能

    需要用到的库有selenium,还需要安装Chrome浏览器驱动,具体如何安装我就不详述了 在这里我模拟了csdn的登录过程 ** 1**.首先打开网页,用户名+密码登录,然后定位用户名输入框,和密码 ...

  2. python自动登录教程_Python 实现自动登录+点击+滑动验证功能

    需要用到的库有selenium,还需要安装Chrome浏览器驱动,具体如何安装我就不详述了 在这里我模拟了csdn的登录过程 ** 1**.首先打开网页,用户名+密码登录,然后定位用户名输入框,和密码 ...

  3. jquery实现左右点击滑动

    jquery实现左右点击滑动 前端养成记:最近做的老项目,涉及到的一个简单的小功能,但是我这样的前端菜鸟还是费了一些功夫的,所以这里记录一下,以免日后忘记. 一.首先看下效果吧 这个是效果图,这个地方 ...

  4. 网易云歌词居中滚动、点击/滑动进度条对应滚动、当前播放歌词高亮

    当前播放歌词高亮:根据当前播放时间,和歌词时间对比,获得当前歌词行数索引正常居中滚动.点击/滑动进度条对应滚动:(1)因为这几种方式都是改变当前播放时间,所以只需要根据当前播放时间操作即可(2)根据当 ...

  5. QT中QTableView 点击表头进行排序

    今日,由于工作需要,要实现在QTableView中点击表头进行排序的功能,但QTableView中并未提供此功能,经过苦苦的网络搜索也为发现可用的代码.最后经过跟踪QTableWidget的排序功能实 ...

  6. python登录京东滑动验证_Python 实现自动登录+点击+滑动验证功能

    需要用到的库有selenium,还需要安装Chrome浏览器驱动,具体如何安装我就不详述了 在这里我模拟了csdn的登录过程 ** 1**.首先打开网页,用户名+密码登录,然后定位用户名输入框,和密码 ...

  7. ListView 与 它里面的Item 点击滑动冲突

    转自 http://blog.csdn.net/fzh0803/article/details/9474359 listview的父亲要求滑动,在点击listview区域时要求在滑动的只是只滑动lis ...

  8. qtableview点击行将整行数据传过去_掌握这15个可视化图表,小白也能轻松玩转数据分析...

    转载自:SFUED 原文地址:连环15关,轻松玩转数据可视化 大数据时代,数据驱动决策.处理不好庞大.复杂的数据,其价值将大打折扣. 那如何缩短数据与用户的距离?让用户一眼Get到重点?让老板为你的汇 ...

  9. android触屏设备event模拟,android 使用命令模拟点击 滑动

    adb shell getevent -p 出现上述截图的就是屏幕触摸输入设备 带上 -l adb shell getevent -p-l . EV_ABS      ABS_MT_TRACKING_ ...

  10. android模拟点击滑动,模拟Android的view点击和滑动监听

    一,简单形式的 /*模拟Android中的view 点击和滑动监听 * */ public class View { private OnClickListener onClickListener; ...

最新文章

  1. java 并发实例_java一些常用并发工具示例
  2. 为什么软件开发周期是预估的2~3倍?
  3. Ubuntu 18.04下的Python和OpenCV的安装
  4. 一个基于cocos2d-x 3.0和Box2d的demo小程序
  5. Node.js Undocumented(2)
  6. C++中的继承与虚函数各种概念
  7. leetcode 659. 分割数组为连续子序列(贪心算法)
  8. linux计划任务案例,Linux计划任务Crontab学习笔记(5):常见错误使用案例
  9. windows开发——配置pthread.h头文件
  10. layui date插件设置不能跨月查询
  11. 解读2022城市大脑首批三项标准
  12. java打印Ascii码
  13. 这是一个伟大的时代……世界背后的秘密是什么?
  14. pythyon爬虫实现12306查票
  15. HEVC 、H.264与AVS2 视频压缩
  16. Spring Boot 接口数据加解密,so easy!
  17. G120变频器准备就绪和运行指示信号解析
  18. Oracle项目管理主数据之RBS与ROBS
  19. GitHub里的灭霸脚本,竟都还不是最奇葩的?
  20. Mirai框架qq机器人教程

热门文章

  1. libfetion的使用
  2. 一步步实现 仿制Android LOL多玩盒子(二) 物品装备相关
  3. tracert原理和使用方法
  4. 大班科学电子计算机,计算器教案
  5. c#编程实战宝典 付强_C#编程实战宝典(光盘内容另行下载,地址见书封底)
  6. shiro权限架作战
  7. iOS-深拷贝和浅拷贝
  8. 音视频开发系列(49)视频编码标准发展史
  9. Visual Studio 2019 集成CefSharp
  10. [非线性控制理论]8_三种鲁棒控制器的比较