范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Qt实现炫酷启动图动态进度条

  一、简述
  在软件启动的时候会消耗比较长的时间,原生的进度条已经不能满足我们的需求,这里我们就需要一个会动的进度条,效果如下图所示。
  光效进度条主要是做了一个进度动画,在已完成的部分上进行快速的迭代渲染,给用户一种直观感受,我们的软件一直努力加载,它还活着。
  有了这个进度条之后,当我们的进度从40%到50%这个持续的过程中,界面再也不会出现假死的情况,是不是很完美呢…
  下面我就来分析下这个动效进度条是怎么做的 二、动效进度条
  如效果图所示,光效进度条不同于一般的进度条,他在基础的任务进度之上还添加了一层光效,主要是想告诉用户我们的软件一直在努力运行,请在耐心的等待一下下。
  我自己在做功能的时候,往往喜欢先做一个测试demo,然后在把做好的功能集成在正式环境,这个功能也不列外,如第一节中展示的效果图,就是测试demo的样子,虽然很丑,但是基础功能是有的。
  现在的很多软件,在进度展示上都有了比较绚丽的效果,比如压缩软件,解压文件的时候都会有动效进度条,用过的同学应该都知道长啥样,而我们的光效进度条跟这个效果差不多,除此之外我们还提供了另一种动效,延迟动效,他们两个在一定程度上都展示了更友好的进度效果。
  在开始分析功能前,首先我们先来考虑下我们的需求:动效进度条,也就是说在原来的进度条基础上需要添加实时动画,让进度条看起来更炫酷一些,除了光效进度条以外,还有一种延迟到达进度条,也属于动态进度条。
  延迟动效、说直白一点儿就是延迟到达,当我们设置了进度从10%到20%时,程序模拟了一个渐进的过程,使用一个时间段走完了这10%的进度。
  下面我们分别来介绍这两种进度条的实现
  实现炫酷的进度条我们可以从QWidget自定义开始写,也就是说从头开始写,但通常我们不这样干,因为这样可能会写出无穷无尽的bug,而且现有的轮子已经很稳定了,为什么还要造呢。 1、光效进度条
  光效进度条我们使用了一个小技巧,采用一个简单的办法实现,我们的光效进度条控件继承自Qt原生进度条类QProgressBar,在新类中我们只需要在Qt绘制完原生进度条之后,补画动效即可。 a、paintEvent函数
  paintEvent函数是Qt的绘制函数,当界面刷新的时候,这个接口函数就会被调用,因此我们需要重写这个接口,首先调用父窗口的绘制方法,然后我们在绘制我们自己的动效,代码如下所示 QProgressBar::paintEvent(event); drawCache绘制动效 b、drawCache绘制动效
  绘制动效的时候,我们需要知道动效的绘制区域,这个地方我们需要主动去解析qss的一些参数,Qt的style()->subElementRect这个接口刚好可以拿到我们需要的信息
  下面简单描述下我们的实现流程 首先我们获取进度条的几何大小和中间进度的几何大小,这样的话我们就可以计算出来各border的数值 然后根据我们当前的value值就可以计算出进度条已经走过(就是值小于我们设定的区域)的几何大小 我们的光效将是跑在第二步计算出来的区域上,一直循环迭代 内存里我们维护一个cacheValue,这个值在每次界面刷新的时候递增,但是不能大于第二步的value值,cacheValue将是我们动效绘制的一个关键参数,他表示了动效绘制的长度 构造一个渐变刷子,设置给QPainter 绘制动效
  上下大致描述了下绘制动效的一个流程,下面送上具体代码,由于篇幅原因,代码我进行了部分伪代码处理。 void GMPProgressBar::drawCache() {     QStyleOptionProgressBarV2 opt;     QRect outerRect = style()->subElementRect(QStyle::SE_ProgressBarGroove, &opt, this);     QRect innerRect = style()->subElementRect(QStyle::SE_ProgressBarContents, &opt, this);     QMargins borders(构造一个QMargins);  	QRectF rect(动效绘制区域);  	if (m_iCacheValue != 0) 	{ 		QPainter painter(this); 		QLinearGradient gradient(构造绘图刷子); 		painter.setBrush(gradient); 		painter.drawRoundedRect(rect, 2, 2); 	} } c、定时刷新
  由于我们的动效是需要主动去刷新的,因此我们需要声明一个定时器,然后定时去刷新,实现代码可能像下面这样 connect(m_pCacheTimer, &QTimer::timeout, this, [this]{ 		if (TM_CACHE == m_mode) 		{ 			++m_iCacheValue; 			repaint(); 		}else         {             m_pCacheTimer->stop();         } 	});
  定时器只需要在我们第一次设置进度条值的时候启动,或者当我们设置一个新的值,而定时器没有启动,我们就需要去激活定时器。
  TM_CACHE模式即是我们的动效模式,TM_SMOOTH模式则是我们的延迟到达模式 connect(this, &QProgressBar::valueChanged, [this](int value){//TM_CACHE模式下 启动动画时机 		if (!m_pCacheTimer->isActive() && value != 0 && TM_CACHE == m_mode) 		{ 			m_pCacheTimer->start(m_iRefreshleveling); 		} 	});
  动效进度条效果如下图所示
  2、延迟到达进度条
  动效进度条可能更适用于启动界面,但是也有一些时候,我们可能需要更平缓的一个加载曲线,例如安装软件、卸载软件的时候。
  【领QT开发教程 学习资料,点击下方链接莬费领取  ,先码住不迷路~】「链接」
  a、setValue
  延迟到达进度条和动效进度条的实现方式就有所差别了,对于实现延迟到达进度条,我们这里重写了setValue函数,当外部调用该接口设置value值时,我们并没有立即去设置当前值,而是使用了一个时间段去完成这个值得刷新。 外部调用setValue时,我们首先计算出我们应该绘制的最大宽度PixelMax、当前已经绘制到的最大宽度cacheValue和我们的步长 设置定时器刷新频率,并重启定时器 定时器刷新时,cacheValue自增我们的步长 调用父类的QProgressBar::setValue接口设置值 b、定时器
  延迟达到功能的的定时器和之前我们什么的动效定时器可以混用一个,我们定时器刷新的时候,针对不同的动画模式,我们执行不同的的代码即可,实现代码可能像下面这样 connect(m_pCacheTimer, &QTimer::timeout, this, [this]{ 	if (TM_CACHE == m_mode) 	{ 		++m_iCacheValue; 		repaint(); 	} 	else if (TM_SMOOTH == m_mode) 	{ 		changeSmooth(); 	}     else     {         m_pCacheTimer->stop();     } });
  延迟到达进度条效果如下图所示
  3、接口说明
  光效进度条类对外只暴露了3个接口,分别是设置动画模式、动画时长和刷新频率
  特别需要注意的是,我们这里重写了父类的setValue接口,这意味着我们不能使用多态来操作这个接口 void setTransitionMode(TransitionMode mode);//设置动画模式 void setSmoothDuration(int duration);//设置刷新总时长 模式为TM_SMOOTH时有效 void setRefreshleveling(int rate);//设置刷新频率 每次更改TransitionMode之后会变为默认值 a、修改动画模式
  修改动画模式的时候,我们需要清空内存中的所有数据,并把value值设为0。 void GMPProgressBar::setTransitionMode(TransitionMode mode) { 	if (m_mode == mode) 	{ 		return; 	}  	m_mode = mode; 	clearData();  	QProgressBar::setValue(0); } b、其他接口
  设置刷新时长和频率接口都比较简单,不做特别说明
  特别注意:这个3个接口最好是在动画启动前设置,动画开始后尽量不要去调用 三、启动图
  第二节我们主要是讲述了怎么做一个动效进度条,这一节我们来做一个启动图页面,把这个动效使用进去。
  启动图不是我们主要分析的内容,这个我就简单说下这个类的实现方式和一些借口说明1、实现思路
  Qt已经给我们提供了一个QSplashScreen,但是使用起来还是特别有限,因此这里我把Qt的源码直接进行了二次开发 首先Qt的原生实现方式基本都被移植了出来 启动图使用了简单的上下布局,上面是一张我自绘制的图片,放在了一个QLabel上,下面是动效进度条 自绘制的图片上包括了,产品名称、logo、背景图等等
  【领QT开发教程 学习资料,点击下方链接莬费领取  ,先码住不迷路~】「链接」
  2、背景图切换
  当我们调用setPixmap设置背景图时,如果我们指定了多张图,我将会启动一个定时器,在指定时长后重新构造一张大的背景图,并添加到启动窗口上
  这里主要说明下背景图是怎么构造出来的,代码如下所示 a、根据背景图构造启动图大小,并移动到屏幕中间m_currentPixmap = m_lstPixmaps.at(m_iCurrentIndex);  QRect size(QPoint(), m_currentPixmap.size()  / m_currentPixmap.devicePixelRatio()); size.setHeight(size.height() + StatusBarHeight); setFixedSize(size.size()); m_pProgressBar->setFixedWidth(size.width() / 8 * 3); move(QApplication::desktop()->screenGeometry().center() - size.center()); b、绘制程序logoQPainter painter(&m_currentPixmap); painter.drawPixmap(m_startPos, m_logo); c、绘制标题栏painter.save(); painter.setFont(m_titleFont);  QFontMetrics fontMetrics(m_titleFont); int textWidth = fontMetrics.width(m_strWindowTitle); int textHegith = m_logo.height(); QRect textTect = QRect(m_startPos + QPoint(13 + m_logo.width(), 0), QSize(textWidth, textHegith)); painter.drawText(textTect, m_strWindowTitle, QTextOption(Qt::AlignCenter)); painter.restore(); d、设置给QLabel背景图m_pWindowBackground->setPixmap(m_currentPixmap);
  启动图的效果这里就不在贴图了,第三节上的两个gif图都是最终的启动图效果 四、测试
  最后就是测试代码了,主要是模拟了程序的一个加载过程 1、构造启动图
  首先我们构造一个启动图对象,并设置程序logo和动画模式 GMPSplashScreen * screen = new GMPSplashScreen(QPixmap(":/splashScreen/start.png")); screen->show(); screen->setLogo(QIcon("logo.ico").pixmap(48, 48)); screen->setTransitionMode(GMPProgressBar::TM_CACHE); 2、背景图
  设置背景图,并设置背景图更换时间间隔 QList lstPixmap; lstPixmap.append(QPixmap(":/splashScreen/start.png")); lstPixmap.append(QPixmap(":/splashScreen/start.jpg")); screen->setPixmap(lstPixmap, 2000); 3、其他信息
  设置程序的提示信息和标题栏 screen->showMessage("Established connections", 0); screen->setTitle(QStringLiteral("广联达BIM土建计量GTJ2018")); 4、事件循环
  这里写了一个死循环,主要是为了模拟程序的一个加载过程,每隔10ms处理下界面刷新事件 a.processEvents();  while (1) {     QTest::qSleep(10);     a.processEvents(); } splashScreen w; w.show();  screen->finish(&w);

兄弟们我忍不住下山了,买了个2022年产的RX580本内容来源于什么值得买APP,观点仅代表作者本人作者迟尉兄弟们显卡大降价我忍不住了下山了兄弟们显卡到了SN码一个月内的稳了真香看到下山的就在底下刷矿?一个个的真酸兄弟们给看看打游戏深圳十大客家古村落,经典建筑也可以很美深圳十大客家古村落1华侨城甘坑客家小镇华侨城甘坑客家小镇是在原来具有350多年客家古村落甘坑村的基础上改扩建而成的,2016年,政府与华侨城集团签订协议,华侨城投资500亿元,将现买鲅鱼,记得分清黑尾巴和黄尾巴,别花冤枉钱,口感还差头号有新人买鲅鱼,记得分清黑尾巴和黄尾巴,别花冤枉钱,口感还差说到吃鱼,相信很多吃货朋友都爱吃。不管是清蒸还是红烧,味道和营养都是不错的。尤其今天说到的鲅鱼。鲅鱼不仅肉质鲜嫩,而且菏泽经济社会发展现场观摩工作会议重点项目巨野县鲁抗三叶年产1。57万吨医药及中间体项目12月7日下午,全市经济社会发展现场观摩团来到巨野县,第四站观摩巨野县鲁抗三叶年产1。57万吨医药及中间体项目。巨野县生物医药产业园区,规划占地1500亩,目前已有鲁抗三叶锦颐化学轻症患者居家期间饮食如何搭配?膳食营养是维持人体功能和健康的物质基础,也是保障人体免疫系统正常工作的基础。新冠病毒的轻症患者居家隔离期间饮食如何搭配?老年人日常饮食要注意哪些要点?Q轻症患者应如何安排一日三餐?中医特色疗法脐灸大家好,今天我要介绍的是脐灸疗法。相较普通艾灸法,脐灸更具优势与特色,同时,它从肚脐上用药,也避免了口服中药口感差不方便等不足,根据不同体质,选方辅以药粉,利用药物艾灸穴位三者合一咖啡扫盲贴普通人如何正确的喝咖啡常见问题答疑作为一名咖啡爱好者,我自己每天会喝23杯的手冲,想必每个人身边会有很多人依然对咖啡敬而远之,感觉咖啡喝了会对身体不好,还有些人想去尝试,但是被咖啡的种类和名称搞的晕头转向。今天,我谷医堂调理月经是真吗?6个养生美容大坑,你入了几个?如今各种养生美容的天坑充斥网络和现实世界,到底哪些是真的,哪些是假的?关于这个问题,小谷有话说所有的谣言,都是口口相传而来,缺乏确凿的依据,但懂行的人,就能有效避开天坑。健康养生篇琉璃烤鸭琥珀色,小小一口吃三国我在长沙的冬天里,像一位溺水者,渴求抓住什么,让自己周身暖和些,才好。胃口这东西,也变得忽明忽暗,不甚清晰。总想有点什么,滋味浓郁的吃食,能振奋一下我的精神,它最好带着阳光的颜色,晋享美味丨地道面食,还是要来山西到山西没吃碗面,就等于没来过山西,面食已经成为山西一张重要名片。我是李琨,长期从事山西面食技艺的研究和普及工作。山西的面食品种繁多,工艺复杂。面粉经过揉压搓擀削拨抿擦拉等五十余种的贵州飞天茅台酒53,12月10日最新行情价是多少?飞天茅台酒是中国大曲酱香型的鼻祖,历史悠久。产地内出土的文物中,有相当部分是商周时代的酒具,说明当时已经有酒。距今两千多年前的汉武帝时期,茅台当地就能酿酒,史称枸酱酒。明末清初,以
女人过了30岁,建议你这样活作者闻秋声原创文章,抄袭必究01引言爱就像一个漩涡,它让人深陷其中,无法自拔。女人的一生自从被赋予了母亲这个角色以后,她便将时间与精力一分为二。一份留给了孩子,另一份留给了丈夫,唯恩旅集团领导到景区调研指导工作8月5日,恩旅集团党委副书记总经理田科伟到恩施大峡谷景区调研指导安全生产等相关工作。田科伟一行实地查看了恩施大峡谷景区相关项目现场情况,并就景区安全生产工作项目工作历史遗留问题等提忙了一辈子,人老了,才发现真正属于自己的是这些作者闻秋声原创文章,抄袭必究01引言人生在世,忙忙碌碌一辈子。一天三餐,四季轮回,永不停歇的脚步,为了更好地生活,不得不努力奋斗。人生短短数十载,不停地奋斗,走到头来,才发现很多东抓住秋天长高季,建议孩子,多吃8菜,促进孩子长高,家长收藏好大家好这里是小慧今天说美食,秋天是孩子长高的好季节,饮食方面要注意,建议常给孩子吃八道家常菜,可以更好的促进孩子长高个,小慧将菜谱做法,给大家详细地整理到了下方,家长建议收藏起来,距离地球36。5光年,超级地球罗斯508b被发现,或已存在生命迄今为止,在太阳系之外已经有超4000颗系外行星被科学家发现并记录,其中不乏一些体积和质量与地球相似的岩石行星。它们拥有和地球相同的地质结构,往往会比地球稍大一些,所以它们也被称为37岁戚薇带女儿出行!挺孕肚穿娃娃裙变时髦精,lucky越来越漂亮戚薇跟李承铉结婚之后,感情就一直非常的稳定甜蜜,夫妻俩还经常一起合体出席活动,时时刻刻都不忘秀恩爱,今年37岁的戚薇更是迎来了第2胎,虽然是高龄怀孕,但是状态看上去却非常不错,近日孕妈在孕期,要经常吃4种食物,婴儿出生后可能会更加白净漂亮孕妈在孕期,要经常吃4种食物,婴儿出生后可能会更加白净漂亮!1。紫薯,紫薯的营养价值非常丰富,富含花青素,氨基酸以及葡萄糖类物质,孕妈常吃可以补充大量营养所需,另外,它所富含的维生毕棚沟风景休息一晚,第二天就坐着大巴车,拿着氧气瓶上山了。看介绍,毕棚沟最美的风景是山的颜色。可惜我们来的不是时候。山上的树叶都是绿绿葱葱,没能欣赏到大自然的调色板。第一个景点是一个小瀑布。武夷山晚霞再次实力圈粉!快来看印象的独家收藏!2022年的7月8月我们在武夷山,在印象被来自五湖四海的观众们似火的热情包围近日,接连不断的每日四场演出印象人都在用最好的状态完美献上每场演出除此之外武夷山天边的晚霞也未曾缺席温柔旅游公司一日游只收几十元,还发东西并且管饭,他们不赚钱吗?一日游收几十,还发东西及管饭,别管你几十年的旅游从业经验,以传统旅游公司的运营方式无论如何都是赔本的买卖,除了已被国家禁止的去景点强制消费,更不要说年底返利啦!通过描述,可以断定是中国很受欢迎的14个旅游目的地,每个人都想去看看拥有千年文化的中国,世界第四大地区,一直是个有趣的旅游胜地。哪些中国旅游目的地让旅游爱好者爱不释手,一起来看看哪些地方吧。长城中国的长城是人类伟大的建筑作品之一,所以这个著名的地方