Qt QWidget 简约美观的加载动画 第五季 - 小方块风格
给大家分享两个小方块风格的加载动画
😊 第五季来啦 😊 效果如下:

一个三个文件,可以直接编译运行
//main.cpp
#include "LoadingAnimWidget.h"
#include <QApplication>
#include <QGridLayout>
int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget w;w.setWindowTitle("加载动画 第5季");QGridLayout * mainLayout = new QGridLayout;auto* anim1= new RhombusShift;mainLayout->addWidget(anim1,0,0);auto* anim2 = new TiltingBricks;mainLayout->addWidget(anim2,0,1);w.setLayout(mainLayout);w.show();anim1->start();anim2->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 RhombusShift:public LoadingAnimBase{//做斜向平移的四个菱形
public:explicit RhombusShift(QWidget* parent = nullptr);
protected:void paintEvent(QPaintEvent*);
};
class TiltingBricks:public LoadingAnimBase{//三个正方形一个接一个倾斜倒向右侧
public:explicit TiltingBricks(QWidget* parent = nullptr);
protected:void paintEvent(QPaintEvent*);
};#endif // LOADINGANIMWIDGET_H
//LoadingAnimWidget.cpp
#include "LoadingAnimWidget.h"
#include <QDebug>
#include <QPaintEvent>
#include <QPainter>
#include <QtMath>
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();
}RhombusShift::RhombusShift(QWidget* parent):LoadingAnimBase (parent){mAnim.setDuration(4800);
}
void RhombusShift::paintEvent(QPaintEvent*){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setPen(Qt::NoPen);const int x = width();const int y = height();static const int cornerGap = 4;//菱形内部顶点和中心点的距离static const int edgeGap = 2;//菱形顶点和外边框的距离const qreal edgeLen = (x/2 - cornerGap - edgeGap) / 1.42;// 菱形的边长const int halfDiagonalx = (x/2 - edgeGap - cornerGap )/2;//水平方向一半对角线长度const int halfDiagonaly = (y/2 - edgeGap - cornerGap )/2;//垂直方向一半对角线长度const QPointF point1(x/2,edgeGap + halfDiagonaly); //上方const QPointF point2(x/2 + cornerGap + halfDiagonalx , y/2);//右侧const QPointF point3(x/2, y/2 + cornerGap + halfDiagonaly); //下方const QPointF point4(edgeGap + halfDiagonalx,y/2); //左侧const QList<QPointF> pointList{point1,point2,point3,point4,point1,point2,point3,point4};QPainterPath pathList[4];for(int i = 0;i < 4; ++i){auto & path = pathList[i];path.moveTo(pointList[i]);path.lineTo(pointList[i+1]);path.lineTo(pointList[i+2]);path.lineTo(pointList[i+3]);path.lineTo(pointList[i+4]);}static const QColor brushList[4] = {"lightblue" , "cadetblue" , "lightblue" , "cadetblue"};static const int staticTime = 15;//每次移动到四个节点上面,要静止一段时间,这个值在0-90之间for(int i = 0;i < 4;++i){qreal proportion = 0;const auto rest = fmod(mAngle,90);//余数const auto quotient = (int)mAngle / 90 * 0.25;//商if(rest > 90 - staticTime) proportion = quotient + 0.25;else proportion = rest / (90 - staticTime) * 0.25 + quotient;const QPointF center = pathList[i].pointAtPercent(proportion);painter.translate(center);painter.rotate(45);painter.setBrush(QBrush(brushList[i]));painter.drawRect(-edgeLen/2,-edgeLen/2,edgeLen,edgeLen);painter.resetTransform();}
}
TiltingBricks::TiltingBricks(QWidget* parent):LoadingAnimBase (parent){mAnim.setDuration(4000);
}
void TiltingBricks::paintEvent(QPaintEvent*){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setPen(Qt::NoPen);static const QColor brushList[3] = {"lightcoral" , "lightblue" , "khaki"};const int x = width();const int y = height();painter.translate(x/2,y/2);const int cornerGap = 2;const int edgeLen = x/3;//小方块边长const QRectF rct1(-edgeLen-cornerGap,-edgeLen-cornerGap,edgeLen,edgeLen);//左上const QRectF rct2(-edgeLen-cornerGap,cornerGap,edgeLen,edgeLen);//左下const QRectF rct3(cornerGap,cornerGap,edgeLen,edgeLen);//右下const QRectF baseRectList[3] = {rct1,rct2,rct3};qreal ang = mAngle;int round = (int)ang / 90;if(round >= 4) round = 0;ang = fmod(ang,90);const int rectIdx = (int)ang / 30;ang = fmod(ang,30) * 3;painter.rotate(90*round);for(int i = 0;i < 3;++i){painter.setBrush(QBrush(brushList[i]));if(i == rectIdx){painter.rotate(ang);painter.drawRoundedRect(baseRectList[i],4,4);painter.rotate(-ang);}else{if(i < rectIdx){painter.rotate(90);painter.drawRoundedRect(baseRectList[i],4,4);painter.rotate(-90);}else{painter.drawRoundedRect(baseRectList[i],4,4);}}}
}
相关文章:
Qt QWidget 简约美观的加载动画 第五季 - 小方块风格
给大家分享两个小方块风格的加载动画 😊 第五季来啦 😊 效果如下: 一个三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc, char *arg…...
针对KZG承诺和高效laconic OT的extractable witness encryption
1. 引言 2024年以太坊基金会等成员论文 Extractable Witness Encryption for KZG Commitments and Efficient Laconic OT,开源代码实现见: https://github.com/rot256/research-we-kzg(Rust) 在该论文中,提供了一种…...
Spring Boot中实现列表数据导出为Excel文件
点击下载《Spring Boot中实现列表数据导出为Excel文件》 1. 前言 本文将详细介绍在Spring Boot框架中如何将列表数据导出为Excel文件。我们将通过Apache POI库来实现这一功能,并解释其背后的原理、提供完整的流程和步骤,以及带有详细注释的代码示例。最…...
华为ipv6 over ipv4 GRE隧道配置
思路: PC1访问PC2时,会先构造源ipv6为2001:1::2,目的IPV6为2001:2::2的ipv6报文,然后查看PC1的路由表,发送到R1,r1接收后,以目的IPV6地址2001:2::2查询IPV6路由表,出接口为tun0/0/0…...
项目解决方案:海外门店视频汇聚方案(全球性的连锁店、国外连锁店视频接入和汇聚方案)
目 录 一、概述 二、建设目标及需求 2.1 建设目标 2.2 需求描述 2.3 需求分析 三、建设方案设计 3.1 系统方案拓扑图 3.2 方案描述 3.3 服务器配置推荐 四、产品功能 4.1 资源管理平台 (1)用户权限管理 (2)…...
Java中的数据类型详解
引言 在Java编程中,数据类型是非常重要的概念,它定义了数据的类型和范围,帮助程序员有效地操作数据。Java的数据类型可以分为两大类:基本数据类型和引用数据类型。本文将详细介绍Java中的各种数据类型,并附上相应的代…...
ABBYY FineReader16文档转换、PDF管理与文档比较功能介绍
ABBYY FineReader 16作为一款OCR和PDF一体化程序,其强大的功能使得文档处理变得简单高效。在众多功能中,文档转换、PDF管理和文档比较这三大功能尤为突出,成为了众多企业和个人用户的首选工具。 ABBYY Finereader 16-安装包下载如下ÿ…...
导览系统厂家|景区电子导览|手绘地图|AR导览|语音导览系统
随着元宇宙、VR、AR等新技术的快速发展,旅游服务也更加多元化、智能化。景区导览系统作为旅游服务的重要组成部分,其形式更加多元化智能化。智能导览系统作为一种新的服务方式,能够为游客提供更加便捷的旅游服务和游览体验,也逐渐…...
oracle 如何使用脚本实现访问控制(无需额外插件)
随着这些年勒索病毒的爆发,各个企业对数据安全的要求越来越高,常见的办法有开启数据库审计,加数据库防火墙,网络限制等等;但是细粒度审计会消耗大量系统资源,第三方数据库防火墙一般是需要收费的;这里介绍我个人常用的四个db级别trigger,用于记录部分关键信息可以应对部…...
【C语言】指针初阶
正文开始之前,我们要记住一个东西就是:地址指针 目录 一、指针的解释二、指针变量和地址1、取地址操作符2、指针变量和解引用操作1、指针变量2、拆解指针类型3、解引用操作符4、注意事项 3、指针变量的大小4、指针的解引用5、void*指针 三、指针的运算1、…...
07_html
文章目录 引言前端概述分类 HTML快速入门重要的body标签注释hr标签br标签一些常见的标签标题标签div标签span标签p标签a标签img标签路径问题 ol和ul标签table标签input标签(表单元素)textarea标签(表单元素)select标签(…...
全量知识系统问题及SmartChat给出的答复 之1
Q1. 一套完整的全量知识系统应该有哪些组成部分? 一套完整的全量知识系统应该包括以下组成部分: 数据采集:收集、整理、清洗和存储各种数据,包括结构化数据、半结构化数据和非结构化数据等。 数据存储和管理:建立可靠…...
【appium】App类型、页面元素|UiAutomator与appium|App元素定位
目录 一、App前端基础知识 1、App类型划分 2、App类型对比 3、App页面元素 App页面元素分为布局和控件两种 常见布局: 常见控件:定位软件:appium和sdk自带的uiautomatorviewer都可以定位 二、App元素定位 1、id定位 2、text定位 3…...
ChatGpt大模型入门
环境配置 创建虚拟环境 建议创建一个新的虚拟环境,避免安装依赖冲突, conda下载: https://docs.conda.io/en/latest/miniconda.html conda安装: https://zhuanlan.zhihu.com/p/591091259 或者使用venv 使用参考:http…...
Mac 配置Clion Qt 调试显示变量值
背景 使用Clion开发Qt程序,在进行调试时,会看不到Qt类的变量值,只有指针形式,对于调试很不方便。 环境: Macbook ProCPU:M3Qt 5.15.13CLion 2023.3.4 解决方案 为了让Clion能显示Qt类的值,…...
【Ansys Fluent Web 】全新用户界面支持访问大规模多GPU CFD仿真
基于Web的技术将释放云计算的强大功能,加速CFD仿真,从而减少对硬件资源的依赖。 主要亮点 ✔ 使用Ansys Fluent Web用户界面™(UI),用户可通过任何设备与云端运行的仿真进行远程交互 ✔ 该界面通过利用多GPU和云计算功…...
13.云原生之常用研发中间件部署
云原生专栏大纲 文章目录 mysql主从集群部署mysql高可用集群高可用互为主从架构互为主从架构如何实现主主复制中若是两台master上同时出现写操作可能会出现的问题该架构是否存在问题? heml部署mysql高可用集群 nacos集群部署官网文档部署nacoshelm部署nacos redis集…...
远离远程代码执行 ,RPC 运行时中的三个漏洞是如何被发现的?
引言 MS-RPC 是 Windows 网络中广泛使用的协议,许多服务和应用程序都依赖它。 因此,MS-RPC 中的漏洞可能会导致严重后果。 Akamai 安全情报小组在过去一年中一直致力于 MS-RPC 研究。 我们发现并利用了漏洞,构建了研究工具,并编写…...
零基础学python之高级编程(4)---python异常类型及其类型处理
python异常类型及其类型处理 文章目录 python异常类型及其类型处理前言一、异常的概念二、异常类型1.捕获异常方法2.主动抛出异常 总结 前言 我们在日常学习中或者在开发一个项目时,一定会出现的问题就是报错,今天我们就学习错误类型的种类以及错误类型的处理方法 一、异常的概…...
如何实现三维模型在网页/手机端/APP上的展示与分享?
在四维轻云平台中,只需要简单几步,就能轻松实现三维模型在网页/手机端/APP上的交互展示,也可分享转发给他人进行在线查看。 1、注册登录 打开四维轻云官网,完成注册并登录。 2、创建项目 在【项目管理】中点击“新建项目”按钮…...
PVZ Toolkit 终极指南:5分钟掌握植物大战僵尸最强修改器
PVZ Toolkit 终极指南:5分钟掌握植物大战僵尸最强修改器 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PVZ Toolkit 是一款专为经典游戏《植物大战僵尸》PC版设计的开源辅助工具&#…...
API密钥泄露率飙升47%?Dify 2026网关安全配置(2024Q3 CISA认证级实操手册)
第一章:API密钥泄露率飙升47%的行业现状与Dify 2026网关安全演进逻辑近年来,API密钥泄露事件呈爆发式增长。根据2025年CNVD与OWASP联合发布的《AI服务接口安全年报》,全球生产环境中检测到的硬编码API密钥泄露数量同比上升47%,其中…...
别再只测电压了!用ACS712和STM32给你的Arduino项目加上电流监控(附完整代码)
从零构建高精度电流监测系统:ACS712与STM32的实战指南 在智能硬件开发中,电流监测往往是被忽视却至关重要的环节。无论是评估设备功耗、保护电路安全,还是优化能源效率,精确的电流数据都能为项目带来质的飞跃。本文将带你深入探索…...
题解:洛谷 AT_abc381_a [ABC381A] 11/22 String
本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…...
CSS如何优化弹出菜单的淡入效果_通过CSS变量控制Opacity变化
应避免用 display: none 或 visibility: hidden 配合 opacity 实现淡入动画,而应保持 visibility: visible、仅用 opacity: 0 隐藏,并配合 transform 缓冲;优先使用 CSS property 定义可动画变量 --menu-opacity 控制透明度,绑定 …...
Workrave终极指南:告别重复性劳损的完整解决方案
Workrave终极指南:告别重复性劳损的完整解决方案 【免费下载链接】workrave Workrave is a program that assists in the recovery and prevention of Repetitive Strain Injury (RSI). The program frequently alerts you to take micro-pauses, rest breaks and r…...
【金蝶云星空】报表如何设置勾稽关系校验
学习目标学习本内容后,您将掌握如何设置报表勾稽关系校验。业务背景小蝶每月在出报表时,发现资产负债表不平衡系统也没有进行校验提醒。现在想要加上这个校验。操作步骤打开报表模板 找到要修改的报表模板双击打开修改前确认已经反审核报表模板新增校验…...
Obsidian 与 llm-wiki-skill 是什么
Obsidian 与 llm-wiki-skill 是什么 目录 Obsidian 与 llm-wiki-skill 是什么 一、Obsidian 是什么? 核心特点(一句话讲清) 最简单的使用例子 二、`llm-wiki-skill` 脚本是什么? 它解决了什么问题? 核心原理:编译器模式 vs 传统 RAG 核心功能 三、完整实操案例:用它们学…...
从CRNN到BERT:图解BiLSTM如何成为NLP经典模块的‘骨架’
从CRNN到BERT:BiLSTM如何塑造NLP的十年技术演进 在自然语言处理领域,某些技术模块如同生物进化中的关键器官,它们跨越不同模型架构,成为解决特定问题的通用方案。BiLSTM(双向长短期记忆网络)正是这样一个&q…...
别再花钱买服务器了!手把手教你用GitLab Pages免费托管个人博客(附.gitlab-ci.yml配置)
零成本打造个人技术博客:GitLab Pages全实战指南 你是否曾经为了展示个人项目而纠结于服务器租用费用?或者因为技术博客的托管问题而迟迟没有开始写作?现在,这些困扰都可以迎刃而解。GitLab Pages提供了一个完全免费的解决方案&am…...
