qt环形进度条控件设计

2023-05-16

上效果

在这里插入图片描述
推荐文章:

  • qt电池控件设计:https://blog.csdn.net/weixin_42887343/article/details/113932145
  • QWidget控件拖动:https://blog.csdn.net/weixin_42887343/article/details/114384324
  • QWidget控件旋转方法:https://blog.csdn.net/weixin_42887343/article/details/115037420
  • qt淡化提示框设计:https://blog.csdn.net/weixin_42887343/article/details/109303972
  • qt之led(点阵)控件类设计:https://blog.csdn.net/weixin_42887343/article/details/115348953
  • 加载动画控件类设计:https://blog.csdn.net/weixin_42887343/article/details/118541411
  • 环形进度条控件设计:https://blog.csdn.net/weixin_42887343/article/details/120222293

上代码

1、 控件的h文件

#ifndef ROUNDPROGRESSBAR_H
#define ROUNDPROGRESSBAR_H

#include <QWidget>
#include <QPainter>

#define Abs(x) ((x)>=0?(x):-(x))

class RoundProgressBar : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(float _value READ getValue WRITE _setValue)
public:
    enum SwitchFlags    //控制变量
    {
        defaultText =0x00000001,        //默认文字
        linearColor =0x00000004,        //内圈渐变色
        decorateDot =0x00000008,        //装饰圆点
        outterCirle =0x0000000e,        //外圈
        animation   =0x00000010,        //动画
        all         =0xffffffff        //显示所有效果
    };
    enum InnerDefaultTextStyle    //内部文字展示样式
    {
        percent     =0x00000001,        //百分比
        value       =0x00000002,        //值
        valueAndMax =0x00000004        //值与最大值
    };

    explicit RoundProgressBar(QWidget *parent = 0);
    ~RoundProgressBar();

    void setdefault(int,bool);//设置初始角度,顺时针逆时针
    void setOutterBarWidth(float);//设置外圈宽度
    void setInnerBarWidth(float);//设置内圈宽度
    void setRange(float, float);//设置范围
    void setValue(float);//设置当前值
    void setOutterColor(const QColor&);//设置外圈颜色
    void setInnerColor(const QColor&,const QColor&);//设置内圈渐变色
    void setInnerColor(const QColor&);
    void setDefaultTextColor(const QColor&);//设置默认文字颜色
    void setControlFlags(int);//设置控制命令
    void setPrecision(int); //设置显示数字精度
    //设置内圈默认文字样式
    inline void setInnerDefaultTextStyle(InnerDefaultTextStyle style){_innerDefaultTextStyle=style;}
    //获取当前值
    inline float getValue(){return _value;}

protected:
    void paintEvent(QPaintEvent *);
    void resizeEvent(QResizeEvent *event);

private:
    int _startAngle;//起始角度 范围0-360
    bool _clockWise;//顺时针
    float _outterBarWidth;//outterBar宽度
    float _innerBarWidth;//innerBar宽度
    float _dotX;//圆点矩形坐标
    float _dotY;
    float _min;//最小值,最大值,当前值
    float _max;
    float _value;
    QColor _outterColor;//外圈颜色
    QColor _startColor;//内圈渐变颜色
    QColor _endColor;
    QColor _textColor;//默认文字颜色
    int _precision; //小数点精度
    float _squareStart; //绘制正方形信息
    float _squareWidth;
    quint32 _controlFlags=0x00000000;//控制信号
    InnerDefaultTextStyle _innerDefaultTextStyle; //内圈默认文字样式

    void paintOutterBar(QPainter &);//绘制外圈
    void paintInnerBar(QPainter &);//绘制内圈
    void paintDot(QPainter &);//绘制装饰圆点
    void paintText(QPainter &);//绘制默认内置文字
    void _setValue(float); //设置当前值
    void caculateSquare(); //计算绘制正方形区域信息

};

#endif // ROUNDPROGRESSBAR_H

2、控件cpp文件

#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)//设置值的范围
{
    if(max<min)    //todo 和value比较
    {
        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);

    painter.drawEllipse(rectangle);    //从90度开始,逆时针旋转
}

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;
    if(_innerBarWidth<3)    //当bar宽度小于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;
    }
}

使用示例

使用方法很简单,代码如下:

    RoundProgressBar* bar = new RoundProgressBar(this);
    bar->setOutterBarWidth(22);
    bar->setInnerBarWidth(20);
    bar->setControlFlags(RoundProgressBar::all);

或者采用提升的方式也行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt环形进度条控件设计 的相关文章

  • 洛谷_P1825 [USACO11OPEN]Corn Maze S(尚贤)

    题目 xff1a https www luogu com cn problem P1825 span class token macro property span class token directive keyword include
  • 从知名软件提取出的神器,吊打一众付费

    前言 现在的软件功能虽然越更新越多 xff0c 但也是越来越臃肿了 xff0c 不仅占内存 启动慢 xff0c 老更新也怪麻烦的 你们应该也有过因为某个小功能挺好用而不忍心卸载整款软件的情况吧 今天给大家分享几款从知名软件中提取出来的小工具
  • Ubuntu 设置网络代理的一些配置

    因公司需求 xff0c 连接网络必须使用代理设置连接网络 xff0c 这里给大家分享一下我的配置步骤 xff01 如果以下这些不符合你的需求 xff1a 来看这个 xff1a ubuntu 内网搭建服务器的一些配置 xff0c 完美解决ht
  • Linux上git+gitee的基本使用

    目录 1 git 2 gitee 3 本地仓库建立和git基本使用 1 远程仓库同步到本地仓库 xff1a 2 提交本地仓库到远程仓库进行更新 如在本地代码仓库中新建了test1 txt和test2 txt文件或者对文件内容进行了修改 xf
  • java编程题练习2

    程序6 题目 xff1a 输入两个正整数m和n xff0c 求其最大公约数和最小公倍数 在循环中 xff0c 只要除数不等于0 xff0c 用较大数除以较小的数 xff0c 将小的一个数作为下一轮循环的大数 xff0c 取得的余数作为下一轮
  • 安装Anaconda后,cmd输入python没有结果

    可能是电脑上已经安装过python xff0c 在cmd中输入 where python 查看电脑上所有python解释器所在的路径 路径优先级最高的解释器 xff08 非Anaconda所在路径 xff09 出现损坏 xff0c 或由于其
  • 用python发送163邮件

    邮件是最早有用计算机通信的方式之一 xff0c 采用pop3协议接受邮件 xff0c smtp协议发送邮件 xff0c 基本上所有的计算机通信建立在tcp udp协议之上 xff0c 邮件传输协议也是不列外的 如果想要用编程语言发送邮件 x
  • 【AWS EC2】云端简单部署NodeJS应用

    根据需要启动想要的EC2 注意 xff1a 选择Linux时用x86而不是arm xff0c 不然kafka和zookeeper启动不了 xff08 在我的项目里 xff09 并且bitnami zookeeper latest需要内存超过
  • 在kali linux上安装git与push提交

    在kali linux上安装git与push提交 写在前面 xff1a 最好不要在root账户下创建 xff0c 在使用vscode时会带来好多问题 1 安装git apt get install git 2 添加git服务用户 邮箱 xf
  • 判断一颗二叉树是否为完全二叉树

    package main import 34 container list 34 思路 层序遍历 只需分两种情况 1 xff09 若当前节点左孩子为空右孩子不为空 直接返回不空 2 xff09 若当前节点的左右孩子不全 则其后面的节点必须都
  • 【mybatis-plus】mybatis-plus代码生成器,自动生成controller、service、dao、mapper、pojo代码,可灵活配置生成路径,程序猿的福音!!!

    在我们需要一些数据库的实体类时 xff0c 需要手动创建实体与类 xff0c 这很浪费时间 xff0c 所以我研究了一下和上网找了一些资料 xff0c 整合出了一套可灵活配置生成路径的代码 xff01 xff01 xff01 直接上代码 s
  • python爬虫:爬取携程航班数据

    python爬虫 xff1a 爬取携程航班数据 最近在学爬虫 xff0c 用携程的航班数据练手 xff0c 顺便记录一下 xff0c 话不多说下面开始 xff1a 一 首先来观察一下携程网的航班信息的网页 xff1a 这是一个携程网站的截图
  • PyQt5入门和常用模块(含多线程简单例子)

    1 安装软件包 pip span class token function install span PyQt5 pip span class token function install span pyqt5 tools 2 安装Qtde
  • CentOS 8.5高性能计算开发环境配置备忘

    CentOS 8 5环境配置 在CentOS 8 5系统下配置高性能计算环境 主要包含编译器套件 分布式并行套件 各种数值计算库 Python环境 辅助管理工具 GPU开发环境等 利用CentOS自带的RPM仓库 xff0c 加上OpenH
  • Python3 + BeautifulSoup 爬取Steam热销商品数据

    这次用了BeautifulSoup库来爬取Steam的热销商品 xff0c BeautifulSoup更侧重的是从页面的结构解析 xff0c 根据标签元素等来爬取数据 xff0c 这次遇到两个问题 xff1a 1 Steam热销商品列表经常
  • C语言中用%输出不同内容

    C语言有很多输出函数 xff0c 也有很多输出方式 xff0c 但最基础的还是printf 函数 xff0c 但我们不止能输出想要的内容还能指定输出的方式 xff0c 下面我就对此总结一下 xff0c 本人也是初学者 xff0c 以下内容可
  • 了解script setup语法糖

    了解 lt script setup gt 语法糖 基本语法 lt script setup lang 61 34 ts 34 gt console log 39 hello script setup 39 lt script gt 里面的
  • vscode中修改/重置gitlab远程仓库地址(3种方式)

    vscode中修改 重置gitlab远程仓库地址 方法1 xff1a 更换git远程仓库地址 1 查看当前remotes git remote v 2 修改remotes git remote set url origin https gi
  • Java中时间戳转换日期

    String value 61 34 79898768 34 时间戳 String date 61 stampToDate value 时间戳转换日期 时间戳转换日期方法 public static String stampToDate S
  • SAP-PI/PO ICO中增加过滤条件

随机推荐

  • 今日头条笔试之手串问题

    一 问题描述 题目摘自牛客网 xff0c 可以到牛客网直接查找 xff0c 现直接贴上原题目描述 作为一个手串艺人 xff0c 有金主向你订购了一条包含n个杂色串珠的手串 每个串珠要么无色 xff0c 要么涂了若干种颜色 为了使手串的色彩看
  • VS2015对WDK10驱动程序进行双机调试

    1 设置Visual Studio 2015调试方式 xff1a 主计算机 xff1a WIN7 64位 虚拟机 xff1a WIN7 64位 调试器 xff1a VS2015 调试的软件 xff1a 内核驱动程序 一 主计算机和虚拟机两台
  • Node.js下载及安装步骤

    一 安装环境 1 本机系统 xff1a Windows 11 xff08 64位 xff09 2 Node js xff1a v16 14 2LTS xff08 64位 xff09 二 安装Node js步骤 1 下载对应系统的Node j
  • IDEA中设置默认Maven配置

    一 每次打开项目时修改maven配置 xff08 默认的maven地址可能不是我们想要的 xff0c 可以通过下面方法修改 xff09 二 配置默认的地址 第一种方法太麻烦 xff0c 每次打开项目都需要配置maven xff0c 我们可以
  • sql server 2014下载及安装步骤—图解

    注意 xff1a 1 Win10之后的系统 xff0c 在安装之前需要安装 net framework 3 5 sp1 xff0c 以免后续安装报错 2 Express版本为缩减版 xff0c 无SSMS xff0c 需自行下载 xff0c
  • win11安装IIS步骤—图解

    1 使用快捷键win 43 r 输入control 打开控制面板 xff0c 然后点击程序 xff0c 选择启用或关闭Windows功能 xff0c 勾选Internet Information Services 默认安装IIS 2 通过
  • SqlServer怎么计算两个日期之差,精确到毫秒计算

    DateTime xff1a 字段类型对应的时间格式是 yyyy MM dd HH mm ss fff xff0c 3个f xff0c 精确到1毫秒 ms xff0c 示例 2023 01 07 10 06 15 433 DateTime2
  • 直接在浏览器中访问程序无问题,在IIS中点击浏览网站无反应

    问题 xff1a 直接在浏览器中访问程序无问题 xff0c 在IIS中点击浏览网站无反应 解决方案 xff1a 在设置中点击应用后设置默认的浏览器
  • 在IIS中发布NetCore程序

    需安装的软件 xff0c 如下图所示 软件下载地址 xff1a https dotnet microsoft com en us download dotnet 注意 xff1a 发布的程序版本必须和本地安装的一致 xff0c 否则会报错
  • PotPlayer优化与最高画质设置(最强本地播放器)

    一 前言 软件 xff1a PotPlayer 描述 xff1a 被誉为本地视频最好用的播放器 xff01 PotPlayer下载地址参考 xff1a https potplayer org 推荐Potplayer论坛 xff1a http
  • 基于51单片机定时器计数+74HC595移位寄存器+8位数码管时钟

    基于51单片机 74HC595移位寄存器 8位数码管时钟 Proteus仿真 实例代码 span class token macro property span class token directive hash span span cl
  • 51单片机外部中断使用示例程序

    51单片机外部中断使用示例程序 本实例来源以STC89演示示例 xff0c 为了方便初学者更好的阅读 xff0c 直接将其贴出来 首先分享一份 STC单片机资源一览表 你也可以从https www stcisp com 下载到 xff0c
  • 使用kubeadm部署kubernetes集群

    一 安装环境准备 1 安装环境 xff1a centos7 5 xff0c 一个master节点 xff0c 两个node节点 CentOS Linux release 7 5 1804 Core 2 设置 etc hosts文件的IP和主
  • 【Proteus仿真】51单片机自定义倒计时

    Proteus仿真 51单片机自定义倒计时 Proteus仿真 类似一个时间闹铃的一个功能 只不过这是只是一个用来倒计时的 程序源码 span class token comment 实验说明 实验接线 1 动态数码管模块 gt 单片机管脚
  • 微信小程序云开发之数据库操作

    一 初始化 xff1a 在做数据的操作 xff08 增删改查 xff09 之前 xff0c 先要获取数据库的对象 xff0c 可以通过wx cloud database函数来获取到 xff0c 这个函数默认会使用wx cloud init方
  • QT中QTablewidget表格常用操作

    QTabwidget常用操作 0 QTableWidget初始化示例1 列设置 xff08 表头 xff09 1 1 添加表头1 2 设置表头样式 xff08 颜色和字体 xff09 1 3 设置表头宽度1 4 自适应表头宽度1 5 设置表
  • qt获取天气代码

    qt显示天气信息 1 发送网络请求获取天气数据1 1 需要包含的头文件1 2 创建QNetworkAccessManager对象1 3 发送请求1 4 获取数据并解析 2 天气JSON格式数据3 demo代码4 最终效果 1 发送网络请求获
  • qt弹窗界面模态设置

    1 模态说明 模态 xff1a 启动模态界面时 xff0c 例如弹出对话框强制用户从其他正在进行的业务中聚焦到当前对话框 xff0c 除了该对话框整个应用程序窗口都无法接受用户响应 xff0c 无法切换界面 xff0c 无法切换当前Qt应用
  • QTabWidget常用样式设置

    1 前言 个人使用qt xff0c 感觉QTabwidget是个非常好用的控件 xff0c 但有时候总是感觉其tab样式不好控制或说不够灵活 xff0c 从而导致放弃使用该控件 比如说 xff0c 标签横向显示的时候 xff0c 文字随之也
  • qt环形进度条控件设计

    上效果 推荐文章 xff1a qt电池控件设计 xff1a https blog csdn net weixin 42887343 article details 113932145QWidget控件拖动 xff1a https blog