Qt 简约又简单的加载动画 第七季 音量柱风格

今天和大家分享两个音量柱风格的加载动画,这次的加载动画的最大特点就是简单,只有几行代码. 效果如下:
在这里插入图片描述
一共三个文件,可以直接编译运行

//main.cpp
#include "LoadingAnimWidget.h"
#include <QApplication>
#include <QGridLayout>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    w.setWindowTitle("加载动画 第7季");
    QGridLayout * mainLayout = new QGridLayout;

    auto* anim1= new MagnitudeMeter;
    mainLayout->addWidget(anim1,0,0);

    auto* anim2 = new MagnitudeMeter;
    mainLayout->addWidget(anim2,0,1);
    anim2->setColor("lightblue");

    auto* anim3 = new MagnitudeMeter;
    mainLayout->addWidget(anim3,0,2);
    anim3->setColor("slateblue");

    auto* anim4 = new ThreeColumn;
    mainLayout->addWidget(anim4,1,0);

    auto* anim5 = new ThreeColumn;
    mainLayout->addWidget(anim5,1,1);
    anim5->setColor("lightblue");

    auto* anim6 = new ThreeColumn;
    mainLayout->addWidget(anim6,1,2);
    anim6->setColor("slateblue");

    w.setLayout(mainLayout);
    w.show();
    anim1->start();anim2->start();anim3->start();anim4->start();anim5->start();anim6->start();
    return a.exec();
}

//LoadingAnimWidget.h
#ifndef LOADINGANIMWIDGET_H
#define LOADINGANIMWIDGET_H
#include <QPropertyAnimation>
#include <QWidget>
class LoadingAnimBase:public QWidget
{
    Q_OBJECT
    Q_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 MagnitudeMeter:public LoadingAnimBase{//一个类似音量检测器的动画,有一排小柱子,它们的高度随时变化
public:
    MagnitudeMeter(QWidget* parent = nullptr);
    void setColor(const QColor& color);
protected:
    void paintEvent(QPaintEvent*);
private:
    QColor mColor;
};
class ThreeColumn:public LoadingAnimBase{//上一个的简化版,三个循环变化高度的小柱子
public:
    ThreeColumn(QWidget* parent = nullptr);
    void setColor(const QColor& color);
protected:
    void paintEvent(QPaintEvent*);
private:
    QColor mColor;
};
#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 forever
    mAnim.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();
}

MagnitudeMeter::MagnitudeMeter(QWidget* parent):LoadingAnimBase(parent),mColor("cadetblue"){
    mAnim.setDuration(8000);
}
void MagnitudeMeter::setColor(const QColor& color){
    if(mColor != color){
        mColor = color;
        update();
    }
}

void MagnitudeMeter::paintEvent(QPaintEvent*){
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(mColor));

    const qreal x = width();
    const qreal y = height();

    static const int amount = 8;//8个小柱子
    static const int gap = 2;//小柱子之间的间距
    const qreal w = (0.667*x - (amount-1)*gap) / amount;

    painter.translate(x/6,0.667*y);
    static QList<qreal> offsetList;
    static QList<qreal> factorList;
    if(offsetList.size() <= 0){
        QRandomGenerator g;
        for(int i = 0;i < amount;++i) offsetList.push_back(g.bounded(1.0) * 2*M_PI);
        for(int i = 0;i < amount;++i) factorList.push_back(g.bounded(4) + 1);//周期不一样
    }

    for(int i = 0;i < amount;++i){
        const int maxh = y/3;
        const int h = (1+qSin((2*M_PI/360 * mAngle * factorList[i]) + offsetList[i]))/2 * 0.8*maxh+0.2*maxh;
        painter.drawRect(i*(gap + w),-h,w,h);
    }
}
ThreeColumn::ThreeColumn(QWidget* parent):LoadingAnimBase (parent),mColor("cadetblue"){}
void ThreeColumn::setColor(const QColor& color){
    if(mColor != color){
        mColor = color;
        update();
    }
}
void ThreeColumn::paintEvent(QPaintEvent*){
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(mColor));
    const qreal x = width();
    const qreal y = height();
    painter.translate(x/2,y/2);
    static const int w = 8;
    static const int h = 16;
    static const int gap = 4;
    qreal h1 = h/2+h/2*qSin(-2*M_PI/360*mAngle);
    qreal h2 = h/2+h/2*qSin(-2*M_PI/360*mAngle + M_PI*2/3);
    qreal h3 = h/2+h/2*qSin(-2*M_PI/360*mAngle + M_PI*4/3);
    qreal yList[3] = {-h1,-h2,-h3};
    qreal xList[3] = {-1.5*w-gap,-0.5*w,0.5*w+gap};
    for(int i = 0;i < 3;++i){
        painter.drawRect(QRectF(xList[i],yList[i],w,-2*yList[i]));
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/423733.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【一竞技】DOTA2-梦幻联赛S22:XG战队 2-1击败 Spirit

在3月1日晚上进行的梦幻联赛第二阶段小组赛上,XG 战队以2-1 击败Spirit战队。双方对阵第三场决胜局:XG前中期优势,冰连续控盾压制最终拿下了比赛胜利,以下是对决战报。 XG战队在天辉,阵容是小狗、火女、人马、墨客、凤凰。Spirit战队在夜魇,阵容是斯温、火枪、龙骑、白虎、飞机…

14.最长公共前缀

题目&#xff1a;编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串""。 解题思路&#xff1a;横向扫描&#xff0c;依次遍历每个字符串&#xff0c;更新最长公共前缀。另一种方法是纵向扫描。纵向扫描时&#xff0c;从前…

Windows命令行工具和PowerShell介绍

Windows命令行工具和PowerShell是两种不同的文本界面命令解释器&#xff0c;它们在Windows操作系统中用于执行各种操作和管理任务。虽然它们都可以用于执行命令和脚本&#xff0c;但它们之间存在着一些区别和特点。 1. Windows命令行工具&#xff08;Cmd.exe&#xff09; …

Flutter开发之CupertinoApp

Flutter开发之CupertinoApp 最近由于使用Flutter编程更多&#xff0c;使用Flutter更顺手&#xff0c;相对于其他前端框架来说&#xff0c;Flutter在跨平台、响应式UI、自绘引擎、即插即用的组件和庞大的社区生态支持方面有更大的优势&#xff1b;Flutter拥有更低的学习成本&am…

elegentbook模板不生成目录的解决方法

这里只有目录两个字、却没有生成目录 在json里面修改 "latex-workshop.latex.autoClean.run": "onBuilt",把onBuilt改为onFailed即可 "latex-workshop.latex.autoClean.run": "onFailed",

cetos7 Docker 安装 gitlab

一、gitlab 简单介绍和安装要求 官方文档&#xff1a;https://docs.gitlab.cn/jh/install/docker.html 1.1、gitlab 介绍 gitLab 是一个用于代码仓库管理系统的开源项目&#xff0c;使用git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务平台&#xff0c;通过该平…

idea中maven配置(一次成功,全部细节都有)

写这篇文章的原因是maven的配置很简单&#xff0c;但是也很容易出错&#xff0c;我连配了两台电脑的maven出现了各种小错误&#xff0c;参考了以下两篇博文IDEA配置Maven教程&#xff08;超详细版~)_idea maven配置教程-CSDN博客 一次包会——最新IDEA配置Maven指南&#xff0…

Oracle dbms_output基本使用2

以前曾使用过Oracle dbms_output&#xff0c;继续熟悉&#xff1b; 执行如下一句&#xff0c;报告错误&#xff0c; 必须放到begin...end里面&#xff1b; 上图也没有把文字输出&#xff0c;因为默认没有开启控制台显示&#xff1b;如下图就输出了文字&#xff0c; put&#x…

python:pyecharts 画基金净值 月K线图

pip install pyecharts1.9.1 pyecharts-1.9.1-py3-none-any.whl 我想在本地&#xff08;PC) 画出 基金净值 月K线图&#xff0c;不想每次看图都需联网。 cd my_dir mkdir echarts cd echarts curl -O https://assets.pyecharts.org/assets/echarts.min.js 修改一下开源代码 …

设计模式——中介者模式(mediator pattern)

概述 如果在一个系统中对象之间的联系呈现为网状结构&#xff0c;如下图所示。对象之间存在大量的多对多联系&#xff0c;将导致系统非常复杂&#xff0c;这些对象既会影响别的对象&#xff0c;也会被别的对象所影响&#xff0c;这些对象称为同事对象&#xff0c;它们之间通过彼…

怎样才算是软件测试中搭建测试环境?

测试环境是QA做好检测运行的前提条件。平稳和可控的测试环境&#xff0c;能够使测试人员在实行测试用例时不用花费额外的时间去维护。有一些企业运维或是研发部会帮忙准备好测试环境&#xff0c;可是QA要是一味依赖别的部门&#xff0c;会局限检测运行的做好。 一、什么是测试…

游戏科技:超越娱乐的界限

12月25日&#xff0c;国家新闻出版署在节日前夕推出令业内人士振奋的好消息——本次共有105款国产网络游戏通过审批&#xff0c;获得版号&#xff0c;这不仅数量超过了历史新高&#xff0c;更使业内人士看到政策回暖的希望。 这105款游戏覆盖多家知名游戏企业&#xff0c;其中不…

vue3+vite 项目的创建

这里要提醒一下&#xff0c;如果我们要使用 vue3 的组合式api 的写法的话&#xff0c; 那么我们使用的 vue 版本不能低于 vue3.2 版本&#xff0c;不能低于 vue3.2 版本&#xff0c;不能低于 vue3.2 版本 vue2 已停止维护了&#xff0c; 现在全面拥抱vue3 之前用 vue-cli 创建…

线程池学习

github看到一个项目&#xff08;GitHub - markparticle/WebServer: C Linux WebServer服务器&#xff09;&#xff0c;内部使用的一个线程池看着不错&#xff0c;拿来学习一下。 /** Author : mark* Date : 2020-06-15* copyleft Apache 2.0*/ #ifndef THREADPO…

计算机服务器中了mallox勒索病毒怎么解密,mallox勒索病毒解密流程

科技技术的第一生产力&#xff0c;网络技术的不断发展与应用&#xff0c;让企业逐步走向数字化时代&#xff0c;通过网络的力量可以为企业更好地开展各项业务工作&#xff0c;网络数据安全问题也由此成为众多企业关心的主要话题。近日&#xff0c;云天数据恢复中心接到某化工集…

PL/SQL执行.sql文件

1.编写.sql文件&#xff0c;创建update.sql文件&#xff0c;文件如下&#xff1a; set feedback off set define off --更新表中所有人的年龄 update a set age18; prompt Done. 2.打开plsql选择命令窗口&#xff0c;即选择File->New->Command Window&#xff1b; 打…

SpringBoot系列(一):SpringBoot介绍

SpringBoot系列(一)&#xff1a;SpringBoot介绍 1. SpringBoot介绍 SpringBoot是由Pivotal团队提供的一套用于构建微服务的基础框架&#xff0c;它旨在简化Spring应用程序的创建和开发过程。 SpringBoot通过设计大量的自动化配置等方式来简化Spring原有样板化的配置&#xff…

开发规范(黑马学习笔记)

开发规范我们主要从以下几方面介绍&#xff1a; 开发规范-REST 我们的案例是基于当前最为主流的前后端分离模式进行开发。 在前后端分离的开发模式中&#xff0c;前后端开发人员都需要根据提前定义好的接口文档&#xff0c;来进行前后端功能的开发。 后端开发人员&#xff1…

【精通Spring】基于注解管理Bean

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

[HackMyVM]靶场 VivifyTech

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Unk…