android 滑动窗口,Qt模仿Android、IOS滑动窗口效果

#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()<

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()<objectName()="<objectName();

int mseconds = pressDateTime.msecsTo(QDateTime::currentDateTime());

// qDebug()<

int limit = 440;

pageStep = 240;//scrollBarV->pageStep();

// qDebug()<

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()<

//qDebug()<

move_y = QCursor::pos().y();

}

return false;

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值