一、前言

现在web形式的图表框架非常流行,国产代表就是echart,本人用过几次,三个字屌爆了来形容,非常强大,而且易用性也非常棒,还是开源免费的,使用起来不要太爽,内置的各种图表和仪表盘等非常丰富,展现形式也是非常多样的。

本次要写的圆弧进度条,就是参考自echart中的一个圆弧进度条,主要结构就是外围一圈圆角进度,中间加上标题和对应进度的百分比,进度条的起始角度和结束角度可以自行调整,这样的话进度条的开口就可以在左边右边上边下边等任意位置,通过调整角度就能实现。绘制的核心就是drawArc函数。

二、实现的功能

  • 1:可设置范围值,支持负数值
  • 2:可设置精确度,最大支持小数点后3位
  • 3:可设置圆弧宽度
  • 4:可设置开始旋转角度/结束旋转角度
  • 5:可设置仪表盘的标题
  • 6:可设置背景颜色/进度颜色/值颜色/文字颜色
  • 7:自适应窗体拉伸,文字自动缩放
  • 8:可自由拓展各种渐变色
  • 9:可设置百分比模式,自动计算值换算成百分比

三、效果图

四、头文件代码

#ifndef PROGRESSARC_H
#define PROGRESSARC_H /**
* 百分比仪表盘控件 作者:feiyangqingyun(QQ:517216493) 2018-8-30
* 1:可设置范围值,支持负数值
* 2:可设置精确度,最大支持小数点后3位
* 3:可设置圆弧宽度
* 4:可设置开始旋转角度/结束旋转角度
* 5:可设置仪表盘的标题
* 6:可设置背景颜色/进度颜色/值颜色/文字颜色
* 7:自适应窗体拉伸,文字自动缩放
* 8:可自由拓展各种渐变色
* 9:可设置百分比模式,自动计算值换算成百分比
*/ #include <QWidget> #ifdef quc
#if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
#include <QtDesigner/QDesignerExportWidget>
#else
#include <QtUiPlugin/QDesignerExportWidget>
#endif class QDESIGNER_WIDGET_EXPORT ProgressArc : public QWidget
#else
class ProgressArc : public QWidget
#endif {
Q_OBJECT
Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
Q_PROPERTY(double maxValue READ getMaxValue WRITE setMaxValue)
Q_PROPERTY(double value READ getValue WRITE setValue)
Q_PROPERTY(int precision READ getPrecision WRITE setPrecision) Q_PROPERTY(int startAngle READ getStartAngle WRITE setStartAngle)
Q_PROPERTY(int endAngle READ getEndAngle WRITE setEndAngle) Q_PROPERTY(QColor arcColor READ getArcColor WRITE setArcColor)
Q_PROPERTY(QColor textColor READ getTextColor WRITE setTextColor)
Q_PROPERTY(QColor titleColor READ getTitleColor WRITE setTitleColor)
Q_PROPERTY(QColor baseColor READ getBaseColor WRITE setBaseColor)
Q_PROPERTY(QColor bgColor READ getBgColor WRITE setBgColor) Q_PROPERTY(bool percent READ getPercent WRITE setPercent)
Q_PROPERTY(int arcWidth READ getArcWidth WRITE setArcWidth)
Q_PROPERTY(QString title READ getTitle WRITE setTitle) public:
explicit ProgressArc(QWidget *parent = 0);
~ProgressArc(); protected:
void paintEvent(QPaintEvent *);
void drawArc(QPainter *painter);
void drawValue(QPainter *painter);
void drawTitle(QPainter *painter); private:
double minValue; //最小值
double maxValue; //最大值
double value; //目标值
int precision; //精确度,小数点后几位 int startAngle; //开始旋转角度
int endAngle; //结束旋转角度 QColor arcColor; //圆弧颜色
QColor textColor; //文字颜色
QColor titleColor; //标题颜色
QColor baseColor; //基准颜色
QColor bgColor; //背景颜色 bool percent; //百分比模式
int arcWidth; //圆弧宽度
QString title; //标题 public:
double getMinValue() const;
double getMaxValue() const;
double getValue() const;
int getPrecision() const; int getStartAngle() const;
int getEndAngle() const; QColor getArcColor() const;
QColor getTextColor() const;
QColor getTitleColor() const;
QColor getBaseColor() const;
QColor getBgColor() const; bool getPercent() const;
int getArcWidth() const;
QString getTitle() const; QSize sizeHint() const;
QSize minimumSizeHint() const; public Q_SLOTS:
//设置范围值
void setRange(double minValue, double maxValue);
void setRange(int minValue, int maxValue); //设置最大最小值
void setMinValue(double minValue);
void setMaxValue(double maxValue); //设置目标值
void setValue(double value);
void setValue(int value); //设置精确度
void setPrecision(int precision); //设置开始旋转角度
void setStartAngle(int startAngle);
//设置结束旋转角度
void setEndAngle(int endAngle); //设置圆弧颜色
void setArcColor(const QColor &arcColor);
//设置文本颜色
void setTextColor(const QColor &textColor);
//设置标题颜色
void setTitleColor(const QColor &titleColor);
//设置基准颜色
void setBaseColor(const QColor &baseColor);
//设置背景颜色
void setBgColor(const QColor &bgColor); //设置百分比模式
void setPercent(bool percent);
//设置圆弧宽度
void setArcWidth(int arcWidth);
//设置标题
void setTitle(const QString &title); Q_SIGNALS:
void valueChanged(int value);
}; #endif // PROGRESSARC_H

五、核心代码

void ProgressArc::paintEvent(QPaintEvent *)
{
int width = this->width();
int height = this->height();
int side = qMin(width, height); //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); //绘制背景
if (bgColor != Qt::transparent) {
painter.setPen(Qt::NoPen);
painter.fillRect(this->rect(), bgColor);
} painter.translate(width / 2, height / 2);
painter.scale(side / 200.0, side / 200.0); //绘制圆弧
drawArc(&painter);
//绘制当前值
drawValue(&painter);
//绘制标题
drawTitle(&painter);
} void ProgressArc::drawArc(QPainter *painter)
{
int radius = 99 - arcWidth;
painter->save();
painter->setBrush(Qt::NoBrush); QPen pen;
pen.setWidthF(arcWidth);
pen.setCapStyle(Qt::RoundCap); //计算总范围角度,当前值范围角度,剩余值范围角度
double angleAll = 360.0 - startAngle - endAngle;
double angleCurrent = angleAll * ((value - minValue) / (maxValue - minValue));
double angleOther = angleAll - angleCurrent;
QRectF rect = QRectF(-radius, -radius, radius * 2, radius * 2); //绘制圆弧背景
pen.setColor(baseColor);
painter->setPen(pen);
painter->drawArc(rect, (270 - startAngle - angleCurrent - angleOther) * 16, angleOther * 16); //绘制圆弧进度
pen.setColor(arcColor);
painter->setPen(pen);
painter->drawArc(rect, (270 - startAngle - angleCurrent) * 16, angleCurrent * 16); painter->restore();
} void ProgressArc::drawValue(QPainter *painter)
{
int radius = 100;
painter->save();
painter->setPen(textColor); QFont font;
font.setPixelSize(40);
painter->setFont(font); QString strValue;
if (percent) {
double temp = value / (maxValue - minValue) * 100;
strValue = QString("%1%").arg(temp, 0, 'f', precision);
} else {
strValue = QString("%1").arg((double)value, 0, 'f', precision);
} QRectF textRect(-radius, 0, radius * 2, radius / 3);
painter->drawText(textRect, Qt::AlignCenter, strValue); painter->restore();
} void ProgressArc::drawTitle(QPainter *painter)
{
double radius = 100;
painter->save();
painter->setPen(titleColor); QFont font;
font.setPixelSize(25);
painter->setFont(font); QRectF textRect(-radius, -radius / 2.5, radius * 2, radius / 3);
painter->drawText(textRect, Qt::AlignCenter, title); painter->restore();
}

六、控件介绍

  1. 超过160个精美控件,涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历等。远超qwt集成的控件数量。
  2. 每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须包含所有的代码。
  3. 全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.13的任何Qt版本,支持mingw、msvc、gcc等编译器,支持任意操作系统比如windows+linux+mac+嵌入式linux等,不乱码,可直接集成到Qt Creator中,和自带的控件一样使用,大部分效果只要设置几个属性即可,极为方便。
  4. 每个控件都有一个对应的单独的包含该控件源码的DEMO,方便参考使用。同时还提供一个所有控件使用的集成的DEMO。
  5. 每个控件的源代码都有详细中文注释,都按照统一设计规范编写,方便学习自定义控件的编写。
  6. 每个控件默认配色和demo对应的配色都非常精美。
  7. 超过130个可见控件,6个不可见控件。
  8. 部分控件提供多种样式风格选择,多种指示器样式选择。
  9. 所有控件自适应窗体拉伸变化。
  10. 集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导入导出xml格式。
  11. 自带activex控件demo,所有控件可以直接运行在ie浏览器中。
  12. 集成fontawesome图形字体+阿里巴巴iconfont收藏的几百个图形字体,享受图形字体带来的乐趣。
  13. 所有控件最后生成一个动态库文件(dll或者so等),可以直接集成到qtcreator中拖曳设计使用。
  14. 目前已经有qml版本,后期会考虑出pyqt版本,如果用户需求量很大的话。
  15. 自定义控件插件开放动态库使用(永久免费),无任何后门和限制,请放心使用。
  16. 目前已提供32个版本的dll,其中qt_5_7_0_mingw530_32这个版本会一直保证最新的完整的。
  17. 不定期增加控件和完善控件,不定期更新SDK,欢迎各位提出建议,谢谢!
  18. Qt入门书籍推荐霍亚飞的《Qt Creator快速入门》《Qt5编程入门》,Qt进阶书籍推荐官方的《C++ GUI Qt4编程》。
  19. 强烈推荐程序员自我修养和规划系列书《大话程序员》《程序员的成长课》《解忧程序员》,受益匪浅,受益终生!
  20. SDK地址:https://gitee.com/feiyangqingyun/QUCSDK https://github.com/feiyangqingyun/qucsdk

最新文章

  1. 移动端 Web 开发前端知识整理
  2. wordpress钩子和钩子函数
  3. iTween研究院之学习笔记Move移动篇
  4. server 2012 IIS 启用.NET 4.5
  5. MPAndroidChart
  6. 115 Java Interview Questions and Answers – The ULTIMATE List--reference
  7. YII中引用自定义类
  8. 【转】 ubuntu12.04更新源
  9. python sqlite 查询表的字段名 列名
  10. 基于visual Studio2013解决C语言竞赛题之1055排序
  11. poj 1696 叉积理解
  12. ES6学习之变量的解构赋值
  13. 在oj中Python的循环输入问题解决
  14. 【Java】MyBatis与Spring框架整合(一)
  15. python 判断变量是否存在 防止报错
  16. TBB的学习
  17. MySQL DeadLock故障排查过程
  18. 20165218 《网络对抗技术》Exp3 免杀原理与实践
  19. 静默安装oracle 11g,环境预检查时报错,SEVERE: [FATAL] PRVF-0002 : 无法检索本地节点名
  20. Java 笔记20180123

热门文章

  1. 2019-2020-1 20199302《Linux内核原理与分析》第五周作业
  2. windbg调试托管代码 .Net clr
  3. WebAPI学习
  4. Base64原理解析与使用
  5. 转 Storm JAVA_HOME is incorrectly set.
  6. 配置django的环境实现外部脚本调用django中的模型类
  7. 51 Nod 1430 奇偶游戏(博弈)
  8. [matlab工具箱] 神经网络Neural Net
  9. (33)Vue购物车
  10. segfault at 0 ip sp error 14