一 结果图示

二 代码

头文件

#ifndef CPROGRESS_H
#define CPROGRESS_H

#include <QWidget>
#include <QPainter>
#include <QDebug>
#include <qmath.h>

class CProgress : public QWidget
{
    Q_OBJECT
public:
    explicit CProgress(QWidget *parent = nullptr);
    void setValue(int value);                       //设置值
    void setRectColor(QColor color);                //设置背景颜色
    void setCursorColor(QColor color);              //设置游标颜色
    void setValueColor(QColor color);               //设置值的背景颜色
    void setRadius(int radius);                     //设置圆角半径

signals:

protected:

    void paintEvent(QPaintEvent *);                 //绘制事件重写
    void drawBigRect(QPainter* painter);            //绘制圆角长方形
    void drawCursor(QPainter* painter);             //绘制游标
    void drawValue(QPainter* painter);              //画值
    void drawDots(QPainter* painter);               //绘制进度条上的圆点

public slots:

private:

    QColor m_bigRectColor;  //背景色
    QColor m_cursorColor;   //游标颜色
    QColor m_valueColor;    //当前进度颜色
    QColor m_dotsColor;     //圆点颜色

    int m_radius = 6;       //圆角半径
    int m_xPadding = 10;    //x方向边距
    int m_yPadding = 20;    //y方向边距
    int m_value = 0;        //当前值:0-100
    int m_dotRadius = 4;      //圆点的半径
};

#endif // CPROGRESS_H
三 cpp文件
#include "cprogress.h"

CProgress::CProgress(QWidget *parent) : QWidget(parent)
{
    m_bigRectColor = QColor(220, 220, 220);
    m_cursorColor = QColor(58, 121, 247);
    m_valueColor = QColor(58, 121, 247);
    m_dotsColor = QColor(58, 121, 247);
}

// 重写绘制事件
void CProgress::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);//设置给定的渲染提示;

    drawBigRect(&painter);
    drawCursor(&painter);
    drawValue(&painter);
    drawDots(&painter);
}

//画圆角长方形
void CProgress::drawBigRect(QPainter* painter)
{
    QRect rect(m_xPadding, m_yPadding, width() - m_xPadding * 2, height() - m_yPadding * 2);
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(m_bigRectColor);
    painter->drawRoundedRect(rect, m_radius, m_radius);
    painter->restore();
}

//画五边形游标
void CProgress::drawCursor(QPainter* painter)
{
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(m_cursorColor);

    int x = m_xPadding + (width() - m_xPadding * 2) * m_value / 100;
    int y = height() - m_yPadding;
    int offset = 8;
    QPolygon pts;
    pts.append(QPoint(x, y));
    pts.append(QPoint(x - offset + 2, y + offset));
    pts.append(QPoint(x - offset + 2, y + 2 * offset));
    pts.append(QPoint(x + offset - 2, y + 2 * offset));
    pts.append(QPoint(x + offset - 2, y + offset));
    painter->drawPolygon(pts);//画五边形

    painter->restore();
}

//画值
void CProgress::drawValue(QPainter* painter)
{
    int width = m_value *( this->width() - m_xPadding * 2) / 100;
    QRect rect(m_xPadding, m_yPadding, width, this->height() - m_yPadding * 2);
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(m_valueColor);
    painter->drawRoundedRect(rect, m_radius, m_radius);
    painter->restore();
}

//画进度条上面的点
void CProgress::drawDots(QPainter* painter)
{
    int y = 6;
    int x = 10;
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(m_dotsColor);
    for(int i = 0; i < 5; i++)
    {
        if(i >= 3)
        {
            painter->setBrush(QColor(255, 0, 0));
        }
        x = 10 +  ((width() - m_xPadding * 2)/4) *i;
        if(i == 4)
        {
            x -= 3;
        }
        painter->drawEllipse(x, y, m_dotRadius *  2, m_dotRadius * 2);
    }

    painter->restore();
}

//设置值
void CProgress::setValue(int value)
{
    m_value = value;
    update();
}

//设置背景颜色
void CProgress::setRectColor(QColor color)
{
    m_bigRectColor = color;
    update();
}

//设置游标颜色
void CProgress::setCursorColor(QColor color)
{
    m_cursorColor = color;
    update();
}

//设置当前进度颜色
void CProgress::setValueColor(QColor color)
{
    m_valueColor = color;
    update();
}

//设置圆角半径
void CProgress::setRadius(int radius)
{
    m_radius = radius;
    update();
}
												

Qt 自定义 进度条 纯代码的更多相关文章

  1. Qt之模型/视图(自定义进度条)

    简述 在之前的章节中分享过关于QHeaderView表头排序.添加复选框等内容,相信大家模型/视图.自定义风格有了一定的了解,下面我们来分享一个更常用的内容-自定义进度条. 实现方式: 从QAbstr ...

  2. 自定义进度条PictureProgressBar——从开发到开源发布全过程

    自定义进度条PictureProgressBar——从开发到开源发布全过程 出处: 炎之铠邮箱:yanzhikai_yjk@qq.com 本文原创,转载请注明本出处! 本项目JCenter地址:htt ...

  3. C# 根据BackgroundWoker异步模型和ProgressBar控件,自定义进度条控件

    前言 程序开发过程中,难免会有的业务逻辑,或者算法之类产生让人能够感知的耗时操作,例如循环中对复杂逻辑处理;获取数据库百万乃至千万级数据;http请求的时候等...... 用户在使用UI操作并不知道程 ...

  4. android 自定义进度条颜色

    android 自定义进度条颜色 先看图 基于产品经理各种自定义需求,经过查阅了解,下面是自己对Android自定义进度条的学习过程!   这个没法了只能看源码了,还好下载了源码, sources\b ...

  5. android113 自定义进度条

    MainActivity: package com.itheima.monitor; import android.os.Bundle; import android.app.Activity; im ...

  6. BitBlt()函数实现带数字百分比进度条控件、静态文本(STATIC)控件实现的位图进度条、自定义进度条控件实现七彩虹颜色带数字百分比

    Windows API BitBlt()函数实现带数字百分比进度条控件. 有两个例子:一用定时器实现,二用多线程实现. 带有详细注解. 此例是本人原创,绝对是网上稀缺资源(本源码用Windows AP ...

  7. Android_自定义进度条

    转载:http://blog.csdn.net/lmj623565791/article/details/43371299 ,本文出自:[张鸿洋的博客] 1.概述 最近需要用进度条,秉着不重复造轮子的 ...

  8. jquery自定义进度条与h5原生进度条

      介绍一款自定义的进度条 <div class="box-nine"> <div class="progress"> <!--一 ...

  9. 最简单的android自定义进度条样式

    一.自定义圆形进度条样式 1.在安卓项目drawable目录下新建一个xml文件如下:<?xml version="1.0" encoding="utf-8&quo ...

随机推荐

  1. 洛谷p1725 露琪诺 单调队列优化的DP

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...

  2. input change only trigger once bug

    input change only trigger once bug clear first https://stackoverflow.com/a/11280934/5934465 upload E ...

  3. ts 索引签名 无视多余的属性类型

    interface SquareConfig { color?: string; width?: number; [propName: string]: any; } function asd(opt ...

  4. django学习-14.sys.argv用法和使用场景

    1.前言 sys是python自带的一个内置模块. "sys.argv[0]"的含义:表示代码本身所在的文件路径. sys.argv说白了就是一个从程序外部获取参数的桥梁,这个&q ...

  5. Maven的-pl -am -amd参数

    本文转载自Maven的-pl -am -amd参数学习 昨天maven的deploy任务需要只选择单个模块并且把它依赖的模块一起打包,第一时间便想到了-pl参数,然后就开始处理,但是因为之前只看了一下 ...

  6. HarmonyOS三方件开发指南(13)-SwipeLayout侧滑删除

    鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑--->[课程入口] 目录:1. SwipeLayout组件功能介绍2. SwipeLayout使用方法3. SwipeLa ...

  7. 基于μcOS-II实时操作系统源码实现RMS和EDF调度(共享资源)

    μcOS-II多任务实验报告(RMS.EDF调度) 目录 μcOS-II多任务实验报告(RMS.EDF调度) 一.实验概述 二.环境搭建 三.代码分析 四.实验步骤 1 给TCB块添加扩展 2 创建并 ...

  8. 关于GitHub 搭建 Hexo 总结

    问题描述 在更新上传了一篇新博客后,本地运行http://localhost:4001正常,而连接到Github仓库便爆出404错误. 更新博客后,依次执行: 1 hexo clean 2 hexo ...

  9. Centos7.7下安装Python3.7 并兼容python2.7

    前言 1.首先来看一下系统版本 [root@python3 ~]# cat /etc/redhat-release CentOS Linux release 7.7.1810 (Core) 2.更新一 ...

  10. ubuntu上pyecharts V1版本环境搭建

    1 背景 今天想用pyecharts画图,在新的环境下使用pip安装之后发现,导入pyecharts模块一直失败,报错如下. 图 1 导入pyecharts错误图 请注意:我这里使用的python版本 ...