#include "smoothscrollbar.h" #include #include SmoothScrollBar::SmoothScrollBar(QWidget *parent) : QScrollBar(parent) { m_scrollAni = new QPropertyAnimation(this); m_scrollAni->setTargetObject(this); m_scrollAni->setPropertyName("value"); m_scrollAni->setEasingCurve(QEasingCurve::OutQuint); // 设置动画曲线,在Qt文档中有详细的介绍 m_scrollAni->setDuration(500); // 设置动画时间,数值越小播放越快 m_targetValue_v = value(); // 将m_targetValue_v初始化 } void SmoothScrollBar::setValue(int value) { m_scrollAni->stop(); // 停止现在的动画,防止出现冲突 m_scrollAni->setStartValue(this->value()); // 设置动画滚动的初始值为当前位置 m_scrollAni->setEndValue(value); // 设置动画的结束位置为目标值 m_scrollAni->start(); // 开始动画 } void SmoothScrollBar::scrollTop() { setValue(-m_targetValue_v); // 开始动画 m_targetValue_v = 0; } void SmoothScrollBar::scroll(int value) { // 这里推荐评论区中大佬优化的写法 if (m_targetValue_v - value >= 0) { m_targetValue_v -= value; // 将目标值和相对位置进行运算 setValue(m_targetValue_v); // 开始动画 } } void SmoothScrollBar::mousePressEvent(QMouseEvent *e) { // 当使用鼠标操作滚动条时,不会刷新m_targetValue_v的值,因而需要重写事件,对其进行刷新。 m_scrollAni->stop(); QScrollBar::mousePressEvent(e); m_targetValue_v = value(); } void SmoothScrollBar::mouseReleaseEvent(QMouseEvent *e) { m_scrollAni->stop(); QScrollBar::mouseReleaseEvent(e); m_targetValue_v = value(); } void SmoothScrollBar::mouseMoveEvent(QMouseEvent *e) { m_scrollAni->stop(); QScrollBar::mouseMoveEvent(e); m_targetValue_v = value(); }