一 结果图示

二 代码

头文件

  1. #ifndef CPROGRESS_H
  1. #define CPROGRESS_H
  1.  
  1. #include <QWidget>
  1. #include <QPainter>
  1. #include <QDebug>
  1. #include <qmath.h>
  1.  
  1. class CProgress : public QWidget
  1. {
  1. Q_OBJECT
  1. public:
  1. explicit CProgress(QWidget *parent = nullptr);
  1. void setValue(int value); //设置值
  1. void setRectColor(QColor color); //设置背景颜色
  1. void setCursorColor(QColor color); //设置游标颜色
  1. void setValueColor(QColor color); //设置值的背景颜色
  1. void setRadius(int radius); //设置圆角半径
  1.  
  1. signals:
  1.  
  1. protected:
  1.  
  1. void paintEvent(QPaintEvent *); //绘制事件重写
  1. void drawBigRect(QPainter* painter); //绘制圆角长方形
  1. void drawCursor(QPainter* painter); //绘制游标
  1. void drawValue(QPainter* painter); //画值
  1. void drawDots(QPainter* painter); //绘制进度条上的圆点
  1.  
  1. public slots:
  1.  
  1. private:
  1.  
  1. QColor m_bigRectColor; //背景色
  1. QColor m_cursorColor; //游标颜色
  1. QColor m_valueColor; //当前进度颜色
  1. QColor m_dotsColor; //圆点颜色
  1.  
  1. int m_radius = 6; //圆角半径
  1. int m_xPadding = 10; //x方向边距
  1. int m_yPadding = 20; //y方向边距
  1. int m_value = 0; //当前值:0-100
  1. int m_dotRadius = 4; //圆点的半径
  1. };
  1.  
  1. #endif // CPROGRESS_H
    cpp文件
  1. #include "cprogress.h"
  1.  
  1. CProgress::CProgress(QWidget *parent) : QWidget(parent)
  1. {
  1. m_bigRectColor = QColor(220, 220, 220);
  1. m_cursorColor = QColor(58, 121, 247);
  1. m_valueColor = QColor(58, 121, 247);
  1. m_dotsColor = QColor(58, 121, 247);
  1. }
  1.  
  1. // 重写绘制事件
  1. void CProgress::paintEvent(QPaintEvent *)
  1. {
  1. QPainter painter(this);
  1. painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);//设置给定的渲染提示;
  1.  
  1. drawBigRect(&painter);
  1. drawCursor(&painter);
  1. drawValue(&painter);
  1. drawDots(&painter);
  1. }
  1.  
  1. //画圆角长方形
  1. void CProgress::drawBigRect(QPainter* painter)
  1. {
  1. QRect rect(m_xPadding, m_yPadding, width() - m_xPadding * 2, height() - m_yPadding * 2);
  1. painter->save();
  1. painter->setPen(Qt::NoPen);
  1. painter->setBrush(m_bigRectColor);
  1. painter->drawRoundedRect(rect, m_radius, m_radius);
  1. painter->restore();
  1. }
  1.  
  1. //画五边形游标
  1. void CProgress::drawCursor(QPainter* painter)
  1. {
  1. painter->save();
  1. painter->setPen(Qt::NoPen);
  1. painter->setBrush(m_cursorColor);
  1.  
  1. int x = m_xPadding + (width() - m_xPadding * 2) * m_value / 100;
  1. int y = height() - m_yPadding;
  1. int offset = 8;
  1. QPolygon pts;
  1. pts.append(QPoint(x, y));
  1. pts.append(QPoint(x - offset + 2, y + offset));
  1. pts.append(QPoint(x - offset + 2, y + 2 * offset));
  1. pts.append(QPoint(x + offset - 2, y + 2 * offset));
  1. pts.append(QPoint(x + offset - 2, y + offset));
  1. painter->drawPolygon(pts);//画五边形
  1.  
  1. painter->restore();
  1. }
  1.  
  1. //画值
  1. void CProgress::drawValue(QPainter* painter)
  1. {
  1. int width = m_value *( this->width() - m_xPadding * 2) / 100;
  1. QRect rect(m_xPadding, m_yPadding, width, this->height() - m_yPadding * 2);
  1. painter->save();
  1. painter->setPen(Qt::NoPen);
  1. painter->setBrush(m_valueColor);
  1. painter->drawRoundedRect(rect, m_radius, m_radius);
  1. painter->restore();
  1. }
  1.  
  1. //画进度条上面的点
  1. void CProgress::drawDots(QPainter* painter)
  1. {
  1. int y = 6;
  1. int x = 10;
  1. painter->save();
  1. painter->setPen(Qt::NoPen);
  1. painter->setBrush(m_dotsColor);
  1. for(int i = 0; i < 5; i++)
  1. {
  1. if(i >= 3)
  1. {
  1. painter->setBrush(QColor(255, 0, 0));
  1. }
  1. x = 10 + ((width() - m_xPadding * 2)/4) *i;
  1. if(i == 4)
  1. {
  1. x -= 3;
  1. }
  1. painter->drawEllipse(x, y, m_dotRadius * 2, m_dotRadius * 2);
  1. }
  1.  
  1. painter->restore();
  1. }
  1.  
  1. //设置值
  1. void CProgress::setValue(int value)
  1. {
  1. m_value = value;
  1. update();
  1. }
  1.  
  1. //设置背景颜色
  1. void CProgress::setRectColor(QColor color)
  1. {
  1. m_bigRectColor = color;
  1. update();
  1. }
  1.  
  1. //设置游标颜色
  1. void CProgress::setCursorColor(QColor color)
  1. {
  1. m_cursorColor = color;
  1. update();
  1. }
  1.  
  1. //设置当前进度颜色
  1. void CProgress::setValueColor(QColor color)
  1. {
  1. m_valueColor = color;
  1. update();
  1. }
  1.  
  1. //设置圆角半径
  1. void CProgress::setRadius(int radius)
  1. {
  1. m_radius = radius;
  1. update();
  1. }
  1.  

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. Leetcode(104)-二叉树的最大深度

    给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7], ...

  2. C# 类 (8) - 抽象方法

    抽象 抽象方法 只能 定义在抽象类 里,并且抽象方法里没有具体的代码,像这种 为啥要定义一个空空如也的函数呢?这是为了用来约束 它的派生类 的行为, 这个例子,建立了一个数组,放了cat和dog,这两 ...

  3. webpack4.0源码解析之打包后js文件分析

    首先,init之后创建一个简单的webpack基本的配置,在src目录下创建两个js文件(一个主入口文件和一个非主入口文件)和一个html文件,package.json,webpack.config. ...

  4. js code review

    js code review https://codereview.stackexchange.com/ refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只 ...

  5. vi, vim 使用教程

    vim 使用教程 ```shcd lscd ../cd -pwdcprmmkdirtarmvmbtar -zcfchmodsshtopqfree ``` 数字0含空字符到行首,^不含空字符到行首.G移 ...

  6. JavaScript code 性能优化

    1 1 1 JavaScript 性能优化 prototype 闭包 Closure 内存泄漏 event system 1 定义类方法以下是低效的,因为每次构建baz.Bar的实例时,都会为foo创 ...

  7. ESLint All In One

    ESLint All In One ESLint $ yarn add -D eslint .eslintrc.{js,yml,json} 优先级 .eslintrc .eslintrc.js .es ...

  8. Stack Overflow & Segment Fault

    Stack Overflow & Segment Fault https://stackoverflow.com/ https://stackoverflow.com/users/593446 ...

  9. uniapp 扫二维码跳转

    在h5和wxapp中 生成qrcode的组件 https://ext.dcloud.net.cn/plugin?id=39 wx小程序扫二位码文档 生成链接时 computed: { ...mapSt ...

  10. NGK:APP一站式挖矿高收益项目

    NGK是10月中旬刚上线的公链项目,采用手机挖矿形式.NGK数字增益平台,200美金即可入场,收益可观,分为静态和动态两种,投资算力收益超高.邀请好友挖矿还有额外的返佣. NGK立志为所有人创造无差别 ...