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

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类便可以支持纵向的平滑滚动。其他的列表控件方法一致。

三、测试效果

SmoothScrollArea列表控件加入到主窗口后,运行即可。

补充

在此之前参考过deepin-launcher的小窗口模式列表代码,deepin的平滑滚动策略存在缺陷,导致体验较差。这里我详细说明一下这一简单的问题,非deepin用户或开发者可以到此为止了。

/**

  • @brief AppListView::wheelEvent 鼠标滑轮事件触发滑动区域控件动画

  • @param e 鼠标滑轮事件指针对象

*/

void AppListView::wheelEvent(QWheelEvent *e)

{

if (e->orientation() == Qt::Horizontal)

return;

int offset = -e->delta();

m_scrollAni->stop();

m_scrollAni->setStartValue(verticalScrollBar()->value());

m_scrollAni->setEndValue(verticalScrollBar()->value() + offset * m_speedTime);

m_scrollAni->start();

}

由代码中可以看到,首先他屏蔽了横向滑动的事件,这个主要应对触控板的一些问题。

offset为滚动的距离,每次滚动之前先停止上次动画(如果还没有结束的话),然后在以当前位置为起始位置,以相对offset的位置为结束位置,这就会导致一个问题。

假设有两个连续的滚动事件被触发,上边这个函数就会执行两次。这里会出现两种情况:

先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

style=“zoom: 33%;” />

最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。

[外链图片转存中…(img-HpoZySOK-1711440266675)]

需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值