QtableView点击滑动设计
效果
头文件:
#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点击滑动设计相关推荐
- python写一个自动登录脚本_Python 实现自动登录+点击+滑动验证功能
需要用到的库有selenium,还需要安装Chrome浏览器驱动,具体如何安装我就不详述了 在这里我模拟了csdn的登录过程 ** 1**.首先打开网页,用户名+密码登录,然后定位用户名输入框,和密码 ...
- python自动登录教程_Python 实现自动登录+点击+滑动验证功能
需要用到的库有selenium,还需要安装Chrome浏览器驱动,具体如何安装我就不详述了 在这里我模拟了csdn的登录过程 ** 1**.首先打开网页,用户名+密码登录,然后定位用户名输入框,和密码 ...
- jquery实现左右点击滑动
jquery实现左右点击滑动 前端养成记:最近做的老项目,涉及到的一个简单的小功能,但是我这样的前端菜鸟还是费了一些功夫的,所以这里记录一下,以免日后忘记. 一.首先看下效果吧 这个是效果图,这个地方 ...
- 网易云歌词居中滚动、点击/滑动进度条对应滚动、当前播放歌词高亮
当前播放歌词高亮:根据当前播放时间,和歌词时间对比,获得当前歌词行数索引正常居中滚动.点击/滑动进度条对应滚动:(1)因为这几种方式都是改变当前播放时间,所以只需要根据当前播放时间操作即可(2)根据当 ...
- QT中QTableView 点击表头进行排序
今日,由于工作需要,要实现在QTableView中点击表头进行排序的功能,但QTableView中并未提供此功能,经过苦苦的网络搜索也为发现可用的代码.最后经过跟踪QTableWidget的排序功能实 ...
- python登录京东滑动验证_Python 实现自动登录+点击+滑动验证功能
需要用到的库有selenium,还需要安装Chrome浏览器驱动,具体如何安装我就不详述了 在这里我模拟了csdn的登录过程 ** 1**.首先打开网页,用户名+密码登录,然后定位用户名输入框,和密码 ...
- ListView 与 它里面的Item 点击滑动冲突
转自 http://blog.csdn.net/fzh0803/article/details/9474359 listview的父亲要求滑动,在点击listview区域时要求在滑动的只是只滑动lis ...
- qtableview点击行将整行数据传过去_掌握这15个可视化图表,小白也能轻松玩转数据分析...
转载自:SFUED 原文地址:连环15关,轻松玩转数据可视化 大数据时代,数据驱动决策.处理不好庞大.复杂的数据,其价值将大打折扣. 那如何缩短数据与用户的距离?让用户一眼Get到重点?让老板为你的汇 ...
- android触屏设备event模拟,android 使用命令模拟点击 滑动
adb shell getevent -p 出现上述截图的就是屏幕触摸输入设备 带上 -l adb shell getevent -p-l . EV_ABS ABS_MT_TRACKING_ ...
- android模拟点击滑动,模拟Android的view点击和滑动监听
一,简单形式的 /*模拟Android中的view 点击和滑动监听 * */ public class View { private OnClickListener onClickListener; ...
最新文章
- java 并发实例_java一些常用并发工具示例
- 为什么软件开发周期是预估的2~3倍?
- Ubuntu 18.04下的Python和OpenCV的安装
- 一个基于cocos2d-x 3.0和Box2d的demo小程序
- Node.js Undocumented(2)
- C++中的继承与虚函数各种概念
- leetcode 659. 分割数组为连续子序列(贪心算法)
- linux计划任务案例,Linux计划任务Crontab学习笔记(5):常见错误使用案例
- windows开发——配置pthread.h头文件
- layui date插件设置不能跨月查询
- 解读2022城市大脑首批三项标准
- java打印Ascii码
- 这是一个伟大的时代……世界背后的秘密是什么?
- pythyon爬虫实现12306查票
- HEVC 、H.264与AVS2 视频压缩
- Spring Boot 接口数据加解密,so easy!
- G120变频器准备就绪和运行指示信号解析
- Oracle项目管理主数据之RBS与ROBS
- GitHub里的灭霸脚本,竟都还不是最奇葩的?
- Mirai框架qq机器人教程