Qt列表等控件实现平滑滚动&deepin启动器存在的问题

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

//这里重写鼠标事件的目的是在手动点击或拖动滚动条时更新m_targetValue_v变量,并且在拖动时立即结束滚动的动画。

//这里如果不明白作用,可以先注释掉看看手动拖动滚动条时对动画有什么影响。

void mousePressEvent(QMouseEvent *) override;

void mouseReleaseEvent(QMouseEvent *) override;

void mouseMoveEvent(QMouseEvent *) override;

QPropertyAnimation *m_scrollAni; //用来实现动画

int m_targetValue_v; //用来记录目标位置的变量

public slots:

void setValue(int value); //重写的setValue槽函数,实现动画效果

void scroll(int value); //新增相对滚动的槽函数,value为滚动距离的矢量表示

signals:

};

#endif // SMOOTHSCROLLBAR_H

源文件:

#include “smoothscrollbar.h”

#include

SmoothScrollBar::SmoothScrollBar(QWidget* parent):QScrollBar(parent)

{

m_scrollAni=new QPropertyAnimation;

m_scrollAni->setTargetObject(this);

m_scrollAni->setPropertyName(“value”);

m_scrollAni->setEasingCurve(QEasingCurve::OutQuint); //设置动画曲线,在Qt文档中有详细的介绍

m_scrollAni->setDuration(800); //设置动画时间,数值越小播放越快

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::scroll(int value)

{

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

}

二、自定义列表控件

将列表的滚动条替换为我们刚刚自定义的滚动条

头文件:

#ifndef SMOOTHSCROLLAREA_H

#define SMOOTHSCROLLAREA_H

#include

#include

#include “smoothscrollbar.h”

class SmoothScrollArea : public QScrollArea

{

Q_OBJECT

public:

explicit SmoothScrollArea(QWidget *parent = nullptr);

private:

SmoothScrollBar* vScrollBar; //纵向滚动条

void wheelEvent(QWheelEvent* e); //捕获鼠标滚轮事件

};

#endif // SMOOTHSCROLLAREA_H

源文件:

#include “smoothScrollArea.h”

#include

#include

#include

#include

SmoothScrollArea::SmoothScrollArea(QWidget *parent) : QScrollArea(parent)

{

auto layout = new QVBoxLayout;

vScrollBar=new SmoothScrollBar();

vScrollBar->setOrientation(Qt::Orientation::Vertical); //将滚动条设置为纵向

QWidget* w=new QWidget; //主体Widget

for (int i=0;i<200 ;i++ ) { //在w中加入200个label,用来测试滚动

QFont font;

font.setPointSize(i+1);

auto a=new QLabel(QString::number(i));

a->setFont(font);

layout->addWidget(a);

}

setVerticalScrollBar(vScrollBar); //设置纵向滚动条

w->setLayout(layout); //设置布局

setWidget(w); //设置widget

}

void SmoothScrollArea::wheelEvent(QWheelEvent *e)

{

//当捕获到事件后,调用相对滚动的槽函数

vScrollBar->scroll(e->angleDelta().y());

}

到此为止,SmoothScrollArea类便可以支持纵向的平滑滚动。其他的列表控件方法一致。

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

…(img-Esawbv2F-1715899220644)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值