qt-动画圆圈等待-LED数字

qt-动画圆圈等待-LED数字

  • 一、演示效果
  • 二、关键程序
  • 三、下载链接

一、演示效果

在这里插入图片描述

二、关键程序

#include "LedNumber.h"
#include <QLabel>

LEDNumber::LEDNumber(QWidget *parent) : QWidget(parent)
{
    //设置默认宽高比
    setScale((float)0.6);
    //设置默认背景色
    setBackColor(QColor(85,85,85));
    //设置默认文字颜色
    setFrontColor(QColor(255,255,255));
    //设置中间线颜色
    setLineColor(QColor(60,60,60));
    //设置默认文字
    setText("2");
    //设置默认文字大小
    setFontSize(40);
    //设置默认最小尺寸
    this->setMinimumSize(100,100);
}

//**********************************************  设置部分 ****************************************
//设置文字颜色
void LEDNumber::setFrontColor(const QColor & color)
{
    _frontColor=color;
}

//设置背景色
void LEDNumber::setBackColor(const QColor & color)
{
    _backColor=color;
}

//设置中间线颜色
void LEDNumber::setLineColor(const QColor& color)
{
    _lineColor=color;
}

//设置宽高比
void LEDNumber::setScale(float scale)
{
    _scale=scale;
}

//设置文字
void LEDNumber::setText(QString text)
{
    _text=text;
}

void LEDNumber::setFontSize(int size)
{
    _fontSize=size;
}

//**********************************************  绘制部分 ****************************************
void LEDNumber::resizeEvent(QResizeEvent *event)
{
    //计算绘制区域
    caculateArea();
}

void LEDNumber::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    //计算绘制区域
//    caculateArea();
    //绘制背景
    drawBack(painter);
    //绘制文字
    drawText(painter);
    //绘制中间线
    drawLine(painter);
}

//计算绘制区域
void LEDNumber::caculateArea()
{
    if((this->height()-2)*_scale>(this->width()-2))
    {
        _width=this->width()-2;
        _height=_width/_scale;
    }
    else
    {
        _height=this->height()-2;
        _width=_height*_scale;
    }
}

//绘制背景
void LEDNumber::drawBack(QPainter & painter)
{
    QPen pen(_backColor,1);
    painter.setPen(pen);
    QPainterPath path;
    path.addRoundedRect(1,1,_width,_height,10,10);
    painter.fillPath(path,_backColor);
    painter.drawPath(path);
}

//绘制文字
void LEDNumber::drawText(QPainter& painter)
{
    QPen pen(_frontColor);
    painter.setPen(pen);
    painter.setFont(QFont("Microsoft YaHei",_fontSize,75));
    painter.drawText(0,0,_width,_height,Qt::AlignCenter,_text);
}

//绘制中间线
void LEDNumber::drawLine(QPainter & painter)
{
    QPen pen(_lineColor,3);
    painter.setPen(pen);
    painter.drawLine(1,_height/2,_width+1,_height/2);
}

#include "Loading.h"
#include "qmath.h"
#include <QDebug>

Loading::Loading(QWidget *parent) : QWidget(parent),_i(0),_interval(50),_index(0)
{
    //设置背景透明
    //this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
    //this->setAttribute(Qt::WA_TranslucentBackground, true);

    setDotColor(QColor(49, 177, 190));
    setDotCount(20);
    connect(&timer,&QTimer::timeout,this,&Loading::refresh);
    setMaxDiameter(30);
    setMinDiameter(5);
}

//********************************************** 设置部分 *************************************
//设置点的个数
void Loading::setDotCount(int count)
{
    _count=count;
}

//设置点的颜色
void Loading::setDotColor(const QColor & color)
{
    _dotColor=color;
}

//开始动画
void Loading::start()
{
    timer.setInterval(_interval);
    timer.start();
}

//设置最大直径
void Loading::setMaxDiameter(float max)
{
    _maxDiameter=max;
}

//设置最小直径
void Loading::setMinDiameter(float min)
{
    _minDiameter=min;
}
//********************************************** 绘制部分 *************************************
//刷新界面
void Loading::refresh()
{
    repaint();
}

void Loading::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event)
    caculate();
}

void Loading::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    painter.setPen(_dotColor);
    painter.setBrush(_dotColor);

    //绘制点
    paintDot(painter);
}

//计算绘制正方形区域
void Loading::caculate()
{
    _squareWidth=qMin(this->width(),this->height());
    float half=_squareWidth/2;
    _centerDistance=half-_maxDiameter/2-1;

    float gap=(_maxDiameter-_minDiameter)/(_count-1)/2;
    float angleGap=(float)360/_count;

    locationList.clear();
    radiiList.clear();

    for(int i=0;i<_count;i++)
    {
        radiiList<<_maxDiameter/2-i*gap;
        float radian=qDegreesToRadians(-angleGap*i);
        locationList.append(Location(half+_centerDistance*qCos(radian),half-_centerDistance*qSin(radian)));
    }
}

//绘制圆点
void Loading::paintDot(QPainter& painter)
{
    for(int i=0;i<_count;i++)
    {
        painter.setPen(_dotColor);
        //半径
        float radii=radiiList.at((_index+_count-i)%_count);

        //绘制圆点
        painter.drawEllipse(QPointF(locationList.at(i).x,locationList.at(i).y),radii,radii);
        //绘制正方形
        //painter.drawRect(locationList.at(i).x,locationList.at(i).y,radii,radii);
        //绘制文字
        //QFont font("Microsoft YaHei",radii*1.2,75);
        //painter.setFont(font);
        //painter.drawText(QPointF(locationList.at(i).x,locationList.at(i).y),u8"霞");
    }
    _index++;
}

#include "roundprogressbar.h"
#include "qmath.h"
#include <QPropertyAnimation>
#include <QDebug>

RoundProgressBar::RoundProgressBar(QWidget *parent) :
    QWidget(parent),_value(0),_min(0),_max(100),_precision(0)
{
    //设置初始角度,顺时针逆时针
    setdefault(90,true);
    //设置默认外圈宽度
    setOutterBarWidth(18);
    //设置默认内圈宽度
    setInnerBarWidth(16);
    //设置默认范围
    setRange(0,100);
    //设置默认值
    setValue(75);
    //设置外圈颜色
    setOutterColor(QColor(233,248,248));
    //设置默认渐变色
    setInnerColor(QColor(49, 177, 190),QColor(133, 243, 244));
    //设置默认文字颜色
    setDefaultTextColor(QColor(49,177,190));
    //设置默认精度
    setPrecision(0);
    //设置内圈默认文字样式
    setInnerDefaultTextStyle(RoundProgressBar::percent);
}

RoundProgressBar::~RoundProgressBar()
{
}

//********************************************** 外部接口 ****************************************
//设置初始角度,顺时针逆时针
void RoundProgressBar::setdefault(int startAngle,bool clockWise)
{
    _startAngle=startAngle;
    _clockWise=clockWise;
}

//设置外圈宽度
void RoundProgressBar::setOutterBarWidth(float width)
{
    _outterBarWidth=width;
}
//设置内圈宽度
void RoundProgressBar::setInnerBarWidth(float width)
{
    _innerBarWidth=width;
}

//设置值的范围
void RoundProgressBar::setRange(float min,float max)
{
    //todo 和value比较
    if(max<min)
    {
        max=100;
        min=0;
    }
    else
    {
        _max=max;
        _min=min;
    }
}

//设置当前值
void RoundProgressBar::setValue(float value)
{
    QPropertyAnimation* animation=new QPropertyAnimation(this,"_value");
    animation->setDuration(500);
    animation->setStartValue(_value);
    animation->setEndValue(value);
    animation->setEasingCurve(QEasingCurve::OutQuad);
    animation->start();
}

void RoundProgressBar::_setValue(float value)
{
    _value=value;
    repaint();
}

//设置外圈颜色
void RoundProgressBar::setOutterColor(const QColor& outterColor)
{
    _outterColor=outterColor;
}

//设置内圈渐变色
void RoundProgressBar::setInnerColor(const QColor& startColor,const QColor& endColor)
{
    _startColor=startColor;
    _endColor=endColor;
}

//设置内圈渐变色
void RoundProgressBar::setInnerColor(const QColor& startColor)
{
    _startColor=startColor;
}

void RoundProgressBar::setDefaultTextColor(const QColor& textColor)
{
    _textColor=textColor;
}

//设置控制
void RoundProgressBar::setControlFlags(int flags)
{
    this->_controlFlags|=flags;
}

//设置显示数字精度
void RoundProgressBar::setPrecision(int precision)
{
    _precision=precision;
}

//********************************************** 内部绘制部分 ****************************************
void RoundProgressBar::resizeEvent(QResizeEvent *event)
{
    //根据内外圈宽度设置控件最小大小
    if(_outterBarWidth>_innerBarWidth)
        this->setMinimumSize(_outterBarWidth*8,_outterBarWidth*8);
    else
        this->setMinimumSize(_innerBarWidth*8,_innerBarWidth*8);
    //计算绘制正方形区域信息
    caculateSquare();
}

void RoundProgressBar::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);

    //绘制外圈
    paintOutterBar(painter);
    //绘制内圈
    paintInnerBar(painter);
    //绘制外圈
    paintDot(painter);
    //绘制文字
    paintText(painter);
}

//计算绘制正方形区域信息
void RoundProgressBar::caculateSquare()
{
    int minWidth=qMin(this->width(),this->height());
    float barWidth=qMax(_outterBarWidth,_innerBarWidth);
    _squareWidth=minWidth-barWidth-2;
    _squareStart=barWidth/2+1;
    _dotX=_squareStart+_squareWidth/2;
    _dotY=_squareStart;
}

//绘制外圈
void RoundProgressBar::paintOutterBar(QPainter &painter)
{
    if(!(_controlFlags&outterCirle))
        return;
    QPen pen;
    pen.setWidth(_outterBarWidth);
    pen.setColor(_outterColor);
    painter.setPen(pen);
    QRectF rectangle(_squareStart,_squareStart,_squareWidth,_squareWidth);
    //从90度开始,逆时针旋转
    painter.drawEllipse(rectangle);
}

//绘制内圈
void RoundProgressBar::paintInnerBar(QPainter& painter)
{
    QPen pen;
    if(!(_controlFlags&linearColor))
        pen.setColor(_startColor);
    else
    {
        QLinearGradient gradient(0, 0, 0, _squareWidth);
        gradient.setColorAt(0, _startColor);
        gradient.setColorAt(1, _endColor);
        QBrush brush(gradient);
        pen.setBrush(brush);
    }
    pen.setWidth(_innerBarWidth);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::RoundCap);
    pen.setJoinStyle(Qt::RoundJoin);
    painter.setPen(pen);
    QRectF rectangle(_squareStart,_squareStart,_squareWidth,_squareWidth);
    //从90度开始,逆时针旋转
    int startAngle=_startAngle*16;
    int spanAngle=(_value-_min)/(_max-_min)*360*16*(_clockWise?-1:1);
    painter.drawArc(rectangle,startAngle,spanAngle);
}

//绘制装饰圆点
void RoundProgressBar::paintDot(QPainter& painter)
{
    if(!(_controlFlags&decorateDot))
        return;
    //当bar宽度小于3时,便不再绘制装饰圆点
    if(_innerBarWidth<3)
        return;
    painter.setPen(QColor(255,255,255));
    painter.setBrush(QColor(255,255,255));
    //区域为圆点绘制正方形区域
    painter.drawEllipse(_dotX-_innerBarWidth/6,_dotY-_innerBarWidth/6,_innerBarWidth/3,_innerBarWidth/3);
}

//绘制默认内置文字
void RoundProgressBar::paintText(QPainter& painter)
{
    if(!(_controlFlags&defaultText))
        return;
    painter.setPen(_textColor);
    painter.setFont(QFont("Microsoft YaHei",22,75));
    switch (_innerDefaultTextStyle) {
    case value:
        painter.drawText(_squareStart,_squareStart,_squareWidth,_squareWidth,Qt::AlignCenter,QString::number(_value,'f',_precision));
        break;
    case valueAndMax:
        painter.drawText(_squareStart,_squareStart,_squareWidth,_squareWidth,Qt::AlignCenter,
                         QString::number(_value,'f',_precision)+"/"+QString::number(_max,'f',_precision));
        break;
    case percent:
        painter.drawText(_squareStart,_squareStart,_squareWidth,_squareWidth,Qt::AlignCenter,
                         QString::number(_value/_max*100,'f',_precision)+"%");
        break;
    default:
        break;
    }
}



三、下载链接

https://download.csdn.net/download/u013083044/88864197

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

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

相关文章

发布6-JRT摄像头调用

截止这之前&#xff0c;JRT已经拥有Web、打印、导出Excel、监听程序、Linux命令、连设备这些功能&#xff0c;还缺摄像头调用功能。本次补全摄像头调用支持&#xff0c;同时支持把摄像头内嵌到浏览器来供业务做功能。 演示视频 内嵌效果 弹出效果 demo代码 <!DOCTYPE…

镜像的使用条件

Q&#xff1a;老师&#xff0c;我怎么才能把做了一半的脸直接复制呢&#xff1f; A&#xff1a;镜像&#xff0c;但是镜像是有条件的 Q&#xff1a;镜像的使用条件有哪些呢&#xff1f; A&#xff1a; 1.对称面不能存在&#xff0c;必须是镂空的&#xff08;以哪个面做对称…

如何解决服务器之间大量数据文件传输交换慢的问题?

在信息化时代&#xff0c;企业运营的核心之一便是服务器间的数据交换效率。数据流通的速度直接关系到业务的响应速度和企业的整体表现。然而&#xff0c;数据传输速度缓慢的问题时常成为企业发展的绊脚石&#xff0c;可能导致严重的业务损失。本文将深入探讨造成服务器数据传输…

漫漫数学之旅031

文章目录 经典格言数学习题古今评注名人小传 - 经典格言 如果没有数学知识&#xff0c;这个世界的事物是无法搞清楚的。——罗杰培根&#xff08;Roger Bacon&#xff09; 好的&#xff0c;各位看官&#xff0c;让我们来听听罗杰培根这位中世纪的“科学老顽童”是怎么说的&…

招聘不能停!达坦科技2024实习岗位等你来~

01、我们是谁 达坦科技始终致力于打造高性能Al Cloud 基础设施平台DatenLord&#xff0c;积极推动AI应用的落地。DatenLord通过软硬件深度融合的方式&#xff0c;提供高性能存储和高性能网络。为AI 应用提供弹性、便利、经济的基础设施服务&#xff0c;以此满足不同行业客户对…

2024开年,手机厂商革了自己的命

文&#xff5c;刘俊宏 编&#xff5c;王一粟 2024开年&#xff0c;AI终端的号角已经由手机行业吹响。 OPPO春节期间就没闲着&#xff0c;首席产品官刘作虎在大年三十就迫不及待地宣布&#xff0c;OPPO正式进入AI手机时代。随后在开年后就紧急召开了AI战略发布会&#xff0c;…

手写myscrapy(五)

项目地址&#xff1a;https://gitee.com/wyu_001/myscrapy 我们继续完成返回的处理类 MyResponse的实现 先上类图&#xff1a; 主要功能&#xff1a; json() 方法解析返回的json格式内容&#xff0c;转换为 python 的json对象 xpath(&#xff09;方法解析返回的html格式的内…

C++标准库与Boost库:功能丰富的开发工具集

C标准库与Boost库&#xff1a;功能丰富的开发工具集 C是一种强大的编程语言&#xff0c;而C标准库和Boost库则为C开发者提供了广泛的工具和功能。本文将深入探讨C标准库和Boost库&#xff0c;介绍它们的特点、提供的功能以及如何在项目中使用它们来加速开发过程和提高代码质量。…

腾讯云宝塔Linux安装Mysql5.7

一、下载官方mysql包 wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm二、安装mysql包 rpm -ivh mysql-community-release-el7-5.noarch.rpm三、安装mysql yum install mysql-community-server -y四、启动数据库 systemctl start mysqld.service…

JAVA工程师面试专题-Mysql篇

一、基础 1、mysql可以使用多少列创建索引&#xff1f; 16 2、mysql常用的存储引擎有哪些 存储引擎Storage engine&#xff1a;MySQL中的数据、索引以及其他对象是如何存储的&#xff0c;是一套文件系统的实现。常用的存储引擎有以下&#xff1a; Innodb引擎&#xff1a;In…

spark 少量key倾斜的join优化

背景 在使用spark join时&#xff0c;我们经常遇到少量key拥有大量的数据而导致的数据倾斜的问题&#xff0c;这导致了task任务数据处理非常不均匀而影响最终时效 少量key数据倾斜的join优化 这里有一个前提&#xff0c;join的另一边的表没有数据倾斜问题&#xff0c;也就是…

C语言----字符数组指针

1.char arr[] {a,b,c,d,e,f}; sizeof分析类型就可以计算所占的内存空间的大小&#xff1b; &#xff08;1&#xff09;printf("%d\n", sizeof(arr)); 数组名单独放进里面&#xff0c;计算整个数组大小&#xff0c;所以是6字节&#xff1b; &#xff08;2&#xff…

R语言【base】——abs(),sqrt():杂项数学函数

Package base version 4.2.0 Description abs(x) 计算 x 的绝对值&#xff0c;sqrt(x) 计算 x 的正平方根。 Usage abs(x) sqrt(x) Arguments 参数【x】&#xff1a;一个数值或复数向量或数组。 Details 这些都是内部泛型原语函数:可以为它们单独定义方法&#xff0c;也可以…

Elasticsearch从入门到精通-01认识Elasticsearch

Elasticsearch从入门到精通-01认识Elasticsearch &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是程序员行走的鱼 &#x1f342;博主从本篇正式开始ES学习&#xff0c;希望小伙伴可以一起探讨 &#x1f4d6; 本篇主要介绍和大家一块简单认识下ES并了解ES中的主要角色…

鸿蒙自定义侧滑菜单布局(DrawerLayout)

前言 为了实现安卓中的侧滑菜单布局效果&#xff0c;通过查找鸿蒙的布局控件&#xff0c;发现SideBarContainer控件有点像&#xff0c;但是使用中发现并不是很符合我们的UI交互效果&#xff0c;因此我在鸿蒙中通过自定义布局的方式实现&#xff0c;本文主要介绍该自定义控件如…

第3.6章:StarRocks数据导入——DataX StarRocksWriter

一、Datax 1.1 DataX 3.0概述 DataX3.0是一个异构数据源离线同步工具&#xff0c;可以方便的对各种异构数据源进行高效的数据同步。 其github地址为&#xff1a; https://github.com/alibaba/DataX/blob/master/introduction.mdhttps://github.com/alibaba/DataX/blob/mast…

【Java代码审计】XSS漏洞

1. XSS漏洞 XSS&#xff08;Cross Site Scripting&#xff0c;为了和层叠样式表&#xff08;Cascading Style Sheet,CSS&#xff09;有所区分&#xff0c;故称XSS&#xff09;跨站脚本攻击是一种针对网站应用程序的安全漏洞攻击技术。它可以实现用户会话劫持、钓鱼攻击、恶意重…

罗克韦尔AB的PLC实现ModbusTCP和ModbusRTU协议标签方式通讯

本文是通过IGT-DSER智能网关读写AB罗克韦尔Compact、Control系列PLC的标签数据缓存并转为Modbus从站协议&#xff0c;与上位机通讯的案例。 打开智能网关的参数软件(下载地址)&#xff0c;通过功能->数据转发与平台对接&#xff0c;再选择数据转发与缓存’&#xff0c;进入以…

浏览器录屏技术:探索网页内容的视觉记录之道

title: 浏览器录屏技术&#xff1a;探索网页内容的视觉记录之道 date: 2024/2/23 14:32:49 updated: 2024/2/23 14:32:49 tags: 浏览器录屏技术原理Web API应用场景用户体验在线教育产品演示 在当今数字化时代&#xff0c;浏览器录屏技术已经成为了一种强大的工具&#xff0c;…

基于springboot+vue的视频网站系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…