#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
m_scrollBarV = ui->tableWidget->verticalScrollBar();
QObjectList objectList = ui->tableWidget->children();
for(int i = 0; i < objectList.count(); i++)
{
if(objectList.at(i)->objectName() == "qt_scrollarea_viewport")
{
objectList.at(i)->installEventFilter(this);
}
}
}
Widget::~Widget()
{
delete ui;
}
bool Widget::eventFilter(QObject *obj, QEvent *event)
{
static int press_y = 0;
static int move_y = -1;
static int release_y = 0;
static QDateTime pressDateTime;
static QPropertyAnimation *animation = new QPropertyAnimation();
if("qt_scrollarea_viewport" != obj->objectName())
{
return false;
}
int scrollV_max = m_scrollBarV->maximum ();
int scrollV_min = m_scrollBarV->minimum ();
//根据鼠标的动作——按下、放开、拖动,执行相应的操作
if(event->type() == QEvent::MouseButtonPress)
{
//记录按下的时间、坐标
pressDateTime = QDateTime::currentDateTime();
move_y = QCursor::pos().y();
press_y = move_y;
animation->stop();
}
else if(event->type() == QEvent::MouseButtonRelease)
{
//鼠标放开,根据鼠标拖动的垂直距离和持续时间,设置窗口滚动快慢程度和距离
if(animation->targetObject() != m_scrollBarV)
{
animation->setTargetObject(m_scrollBarV);
animation->setPropertyName("value");
}
move_y = -1;
release_y = QCursor::pos().y();
// qDebug()<<"MouseButtonRelease QCursor::pos().y()="<<QCursor::pos().y();
QObject *parent_obj = obj->parent();
if(parent_obj != 0 || parent_obj->inherits("QAbstractItemView"))
{
QTimer::singleShot(150, (QAbstractItemView *)parent_obj
, SLOT(clearSelection()));
}
int endValue;
int pageStep;
if(release_y - press_y != 0 && qAbs(release_y - press_y) > 45)
{
//qDebug()<<"obj->objectName()="<<obj->objectName();
int mseconds = pressDateTime.msecsTo(QDateTime::currentDateTime());
// qDebug()<<"mseconds="<<mseconds;
int limit = 440;
pageStep = 240;//scrollBarV->pageStep();
// qDebug()<<"pageStep="<<pageStep;
if(mseconds > limit)//滑动的时间大于某个值的时候,不再滚动(通过增加分母)
{
mseconds = mseconds + (mseconds - limit) * 20;
}
if(release_y - press_y > 0)
{
endValue = m_scrollBarV->value()
- pageStep * (200.0 / mseconds);//.0避免避免强制转换为整形
if(scrollV_min > endValue)
{
endValue = scrollV_min;
}
}
else if(release_y - press_y < 0)
{
endValue = m_scrollBarV->value() + pageStep * (200.0 / mseconds);
if(endValue > scrollV_max)
{
endValue = scrollV_max;
}
}
if(mseconds > limit)
{
mseconds = 0;//滑动的时间大于某个值的时候,滚动距离变小,减小滑动的时间
}
animation->setDuration(mseconds+550);
animation->setEndValue(endValue);
animation->setEasingCurve(QEasingCurve::OutQuad);
animation->start();
return true;
}
}
else if(event->type() == QEvent::MouseMove && move_y >= 0)
{
//窗口跟着鼠标移动
int move_distance = QCursor::pos().y() - move_y;
int endValue = m_scrollBarV->value() - move_distance;
if(scrollV_min > endValue)
{
endValue = scrollV_min;
}
if(endValue > scrollV_max)
{
endValue = scrollV_max;
}
m_scrollBarV->setValue(endValue);
//qDebug()<<"endValue="<<endValue;
//qDebug()<<"move_distance="<<move_distance;
move_y = QCursor::pos().y();
}
return false;
}
Qt 模仿 Android滑动窗口效果
5星 · 超过95%的资源 需积分: 47 51 浏览量
2016-08-17
09:16:48
上传
评论 8
收藏 6KB RAR 举报
V打好手里的牌DXP
- 粉丝: 132
- 资源: 3
最新资源
- CVE-2019-0708漏洞检测与利用工具
- STM32单片机FPGA毕设电路原理论文报告利用c8051f020系列单片机实现智能仪器开发
- STM32单片机FPGA毕设电路原理论文报告利用8位单片机实现与Internet网络通信应用研究
- STM32单片机FPGA毕设电路原理论文报告利用80C196单片机测量三相异步电动机功率因数
- STM32单片机FPGA毕设电路原理论文报告力学传感器与单片机的接口设计
- p107-u07FLT2.wav
- STM32单片机FPGA毕设电路原理论文报告雷达幅频特性测试仪的智能化研究
- STM32单片机FPGA毕设电路原理论文报告可组网电子温湿度测量仪的设计与实现
- STM32单片机FPGA毕设电路原理论文报告可在单片机上实现的语音混沌保密通信方法
- STM32单片机FPGA毕设电路原理论文报告可实现的基于MCS51单片机的恒温控制系统的设计
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
前往页