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