mirror of
https://gitee.com/spark-store-project/spark-store
synced 2025-12-15 13:22:04 +08:00
57 lines
2.0 KiB
C++
57 lines
2.0 KiB
C++
#include "smoothscrollbar.h"
|
||
#include <QWheelEvent>
|
||
#include <QDebug>
|
||
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();
|
||
}
|