Qt 简约美观的加载动画 文本风格 第八季

2024-03-03 00:12

本文主要是介绍Qt 简约美观的加载动画 文本风格 第八季,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天和大家分享一个文本风格的加载动画, 有两类,其中一个可以设置文本内容和文本颜色,演示了两份. 共三个动画, 效果如下:
在这里插入图片描述

一共三个文件,可以直接编译 , 如果对您有所帮助的话 , 不要忘了点赞呢.

//main.cpp
#include "LoadingAnimWidget.h"
#include <QApplication>
#include <QGridLayout>
int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget w;w.setWindowTitle("加载动画 第8季");QGridLayout * mainLayout = new QGridLayout;auto* anim1= new TextInBouncingBox("正在加载");mainLayout->addWidget(anim1,0,0);auto* anim2 = new TextInBouncingBox("正在加载中");anim2->setBoxColor("slateblue");anim2->setTextColor("white");mainLayout->addWidget(anim2,0,1);auto* anim3 = new ExpandingScroll;mainLayout->addWidget(anim3,0,2);w.setLayout(mainLayout);w.show();anim1->start();anim2->start();anim3->start();return a.exec();
}
//LoadingAnimWidget.h
#ifndef LOADINGANIMWIDGET_H
#define LOADINGANIMWIDGET_H
#include <QPropertyAnimation>
#include <QWidget>
class LoadingAnimBase:public QWidget
{Q_OBJECTQ_PROPERTY(qreal angle READ angle WRITE setAngle)
public:LoadingAnimBase(QWidget* parent=nullptr);virtual ~LoadingAnimBase();qreal angle()const;void setAngle(qreal an);
public slots:virtual void exec();virtual void start();virtual void stop();
protected:QPropertyAnimation mAnim;qreal mAngle;
};
class TextInBouncingBox:public LoadingAnimBase{//显示装在上下跳动的盒子里的字符
public:TextInBouncingBox(const QString & str,QWidget* parent = nullptr);void setTextColor(const QColor& color);void setBoxColor(const QColor& color);
protected:void paintEvent(QPaintEvent*);
private:QString mText;QColor mTextColor;QColor mBoxColor;
};
class ExpandingScroll:public LoadingAnimBase{//一个圆环转动两圈之后像卷轴一样展示"正在加载"
public:ExpandingScroll(QWidget* parent = nullptr);
protected:void paintEvent(QPaintEvent*);
};
#endif
//LoadingAnimWidget.cpp
#include "LoadingAnimWidget.h"
#include <QDebug>
#include <QPaintEvent>
#include <QPainter>
#include <QtMath>
#include <QRandomGenerator>
LoadingAnimBase::LoadingAnimBase(QWidget* parent):QWidget(parent){mAnim.setPropertyName("angle");mAnim.setTargetObject(this);mAnim.setDuration(2000);mAnim.setLoopCount(-1);//run forevermAnim.setEasingCurve(QEasingCurve::Linear);setFixedSize(200,200);mAngle = 0;
}
LoadingAnimBase::~LoadingAnimBase(){}
void LoadingAnimBase::exec(){if(mAnim.state() == QAbstractAnimation::Stopped){start();}else{stop();}
}
void LoadingAnimBase::start(){mAnim.setStartValue(0);mAnim.setEndValue(360);mAnim.start();
}
void LoadingAnimBase::stop(){mAnim.stop();
}
qreal LoadingAnimBase::angle()const{ return mAngle;}
void LoadingAnimBase::setAngle(qreal an){mAngle = an;update();
}
TextInBouncingBox::TextInBouncingBox(const QString& str,QWidget* parent ):LoadingAnimBase (parent),mText(str),mBoxColor("darkslategray"),mTextColor("yellow"){setFont(QFont("Microsoft YaHei",16,2));
}
void TextInBouncingBox::setTextColor(const QColor& color){if(mTextColor != color){mTextColor = color;update();}
}
void TextInBouncingBox::setBoxColor(const QColor& color){if(mBoxColor != color){mBoxColor = color;update();}
}void TextInBouncingBox::paintEvent(QPaintEvent*){const int len = mText.size();if(len <= 0) return;QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);QFontMetrics fm(font());const int txtH = fm.height();const int rectH = txtH + 4;const int rectW = fm.horizontalAdvance("w")+4;const qreal x = width();const qreal y = height();painter.translate(0.1*x,0.6*y);painter.setBrush(QBrush(mBoxColor));const qreal amplitude = rectH*0.3;const qreal offset = M_PI / len / 2;for(int i = 0;i < len;++i){QRectF rct( i*rectW,-rectH - amplitude*qSin(-2*M_PI / 360 * mAngle + offset*i) ,rectW,rectH);painter.setPen(Qt::NoPen);painter.drawRect(rct);  //画一个小盒子painter.setPen(mTextColor);painter.drawText(rct,Qt::AlignCenter,QString(mText[i])); //画一个字符}
}ExpandingScroll::ExpandingScroll(QWidget* parent):LoadingAnimBase (parent){setFont(QFont("Microsoft YaHei",16,2));mAnim.setDuration(4000);
}void ExpandingScroll::paintEvent(QPaintEvent*){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);qreal x = width();qreal y = height();painter.translate(x/2,y/2);painter.setBrush(Qt::NoBrush);QPen pen("black");static const qreal penWidth = 4;pen.setWidthF(penWidth);painter.setPen(pen);x -= 4;y -= 4;const auto ang = mAngle;const int arr[9] = {20,30,60,90,150,180,210,275,345};//9个时间节点,分割下面10个分支if(ang < arr[0]){//中间的竖线转变为半圆弧线const qreal h = 0.25*x;painter.drawLine(0,h/2 - ang/arr[0] * h,0,-h/2);painter.drawArc(QRectF(0,-1.5*h,2*h,2*h),180*16,-180*16*ang/arr[0]);}else if(ang < arr[1]){//半圆弧线转变为四分之一圆弧和右侧的小竖线const qreal h = 0.25*x;const qreal ratio = (ang-arr[0])/(arr[1] - arr[0]);qreal start = 180 - 90*ratio;painter.drawArc(QRectF(0,-1.5*h,2*h,2*h),start*16,-start*16);painter.drawLine(x/2,-h/2,x/2,-h/2+h/2*ratio);}else if(ang < arr[2]){//剩下的上方的四分之一圆弧转为大的下方的八分之一圆弧const qreal h = 0.25*x;const qreal ratio = (ang - arr[1]) / (arr[2] - arr[1]);qreal start = 90 - 90 * ratio;painter.drawArc(QRectF(0,-1.5*h,2*h,2*h),start*16,-start*16);painter.drawLine(x/2,-h/2,x/2,0);painter.drawArc(QRectF(-x/2,-y/2,x,y),0,-45*16*ratio);}else if(ang < arr[3]){//小竖线转为下方的大的八分之一圆弧const qreal h = x/8;qreal ratio = (ang-arr[2]) / (arr[3] - arr[2]);painter.drawLine(x/2,-h*(1-ratio),x/2,0);painter.drawArc(QRectF(-x/2,-y/2,x,y),0,-(45+45*ratio)*16);}else if(ang < arr[4]){//大圆弧转两圈qreal ratio = (ang - arr[3]) / (arr[4] - arr[3]);painter.rotate(720*ratio);painter.drawArc(QRectF(-x/2,-y/2,x,y),0,-90*16);}else if(ang < arr[5]){//大圆弧转为竖线qreal ratio = (ang-arr[4]) / (arr[5] - arr[4]);painter.drawArc(QRectF(-x/2,-y/2,x,y),-90*ratio*16,-90*(1-ratio)*16);painter.drawLine(0,y/2,0,y/2 - 0.625*ratio*y);}else if(ang < arr[6]){//竖线缩小一下qreal ratio = (ang - arr[5]) / (arr[6] - arr[5]);painter.drawLine(0,y/2 - 0.375*y*ratio,0,-0.125*y);}else if(ang < arr[7]){//展开卷轴qreal ratio = (ang - arr[6]) / (arr[7] - arr[6]);QPainterPath pp;pp.addRect(QRectF(-0.375*x*ratio,-0.125*y,0.75*x*ratio,y/4).adjusted(penWidth/-2,penWidth/-2,penWidth/2,penWidth/2));painter.setClipPath(pp);const auto rct = QRectF(-0.375*x,-0.125*y,0.75*x,y/4);painter.setBrush(QBrush("burlywood"));painter.drawRoundedRect(rct,4,4);painter.drawText(rct,Qt::AlignCenter,"正在加载");}else if(ang < arr[8]){//展示一小段时间const auto rct = QRectF(-0.375*x,-0.125*y,0.75*x,y/4);painter.setBrush(QBrush("burlywood"));painter.drawRoundedRect(rct,4,4);painter.drawText(rct,Qt::AlignCenter,"正在加载");}else{//收起卷轴qreal ratio = (ang - arr[8])/(360 - arr[8]);QPainterPath pp;pp.addRect(QRectF(-0.375*x* (1-ratio),-0.125*y,0.75*x*(1-ratio),y/4).adjusted(penWidth/-2,penWidth/-2,penWidth/2,penWidth/2));painter.setClipPath(pp);const auto rct = QRectF(-0.375*x,-0.125*y,0.75*x,y/4);painter.setBrush(QBrush("burlywood"));painter.drawRoundedRect(rct,4,4);painter.drawText(rct,Qt::AlignCenter,"正在加载");}
}

这篇关于Qt 简约美观的加载动画 文本风格 第八季的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/767851

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节