Qt 自定义控件环形进度条
效果如下,点击左上角按键,比例不断增大。
#ifndef PROGRESSARC_H
#define PROGRESSARC_H
#include <QWidget>
#include <QColor>
#include <QPainter>
class ProgressArc : public QWidget
{
Q_OBJECT
public:
explicit ProgressArc(QWidget *parent = nullptr);
~ProgressArc();
protected:
void drawUI();
void paintEvent(QPaintEvent *);
void drawArc(QPainter *painter);
void drawValue(QPainter *painter);
void drawTitle(QPainter *painter);
private:
int minValue; //最小值
int maxValue; //最大值
int value; //目标值
int precision; //精确度,小数点后几位
int startAngle; //开始旋转角度
int endAngle; //结束旋转角度
QColor arcColor; //圆弧颜色
QColor textColor; //文字颜色
QColor titleColor; //标题颜色
QColor baseColor; //基准颜色
QColor bgColor; //背景颜色
bool percent; //百分比模式
int arcWidth; //圆弧宽度
QString Text; //标题
public :
//设置范围值
void setRange(int minValue, int maxValue);
//设置目标值
void setValue(int value);
//设置百分比模式
void setPercent(bool percent);
//设置圆弧宽度
void setArcWidth(int arcWidth);
//设置标题
void setText(const QString Text);
void setData(int value,QString Text);
};
#endif // PROGRESSARC_H
#include "progressarc.h"
ProgressArc::ProgressArc(QWidget *parent) : QWidget(parent)
{
minValue = 0; //最小值
maxValue = 100; //最大值
value = 0; //目标值
precision = 0; //精确度,小数点后几位
arcColor = QColor(0,255,0); //圆弧颜色
textColor = QColor(0,0,0); //文字颜色
titleColor= QColor(0,0,0); //标题颜色
baseColor = QColor(0,0,255);//基准颜色
bgColor= QColor(255,255,255); //背景颜色
percent = true; //百分比模式
arcWidth = 20; //圆弧宽度
Text = "Test"; //标题
}
ProgressArc::~ProgressArc()
{
}
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)
{
//计算总范围角度,当前值范围角度,剩余值范围角度
double Persent = value*100/(maxValue-minValue);//绘制的环的比例
double RotateAngle = 360*Persent/100;
int radius = 99 - arcWidth;
QRectF rect = QRectF(-radius, -radius, radius * 2, radius * 2);
painter->save();
painter->setBrush(Qt::NoBrush);
QPen pen;
pen.setWidthF(arcWidth);
pen.setCapStyle(Qt::RoundCap);
//绘制圆弧背景
pen.setColor(baseColor);
painter->setPen(pen);
painter->drawArc(rect, 0, 360*16);
//绘制圆弧进度
pen.setColor(arcColor);
painter->setPen(pen);
painter->drawArc(rect, (90-RotateAngle)*16, RotateAngle*16);
painter->restore();
}
void ProgressArc::drawValue(QPainter *painter)
{
int radius = 50;
painter->save();
painter->setPen(textColor);
QFont font;
font.setPixelSize(20);
painter->setFont(font);
QString strValue;
if (percent) {
double temp = value* 100/ (maxValue - minValue);
strValue = QString("%1%").arg(temp, 0, 'f', precision);
} else {
strValue = QString("%1").arg((double)value, 0, 'f', precision);
}
QRectF textRect(-radius, radius/5, radius * 2, radius / 3);
painter->drawText(textRect, Qt::AlignCenter, strValue);
painter->restore();
}
void ProgressArc::drawTitle(QPainter *painter)
{
double radius = 200;
painter->save();
painter->setPen(titleColor);
QFont font;
font.setPixelSize(16);
painter->setFont(font);
QRectF textRect(-radius, -radius / 4, radius * 2, radius / 3);
painter->drawText(textRect, Qt::AlignCenter, Text);
painter->restore();
}
//设置范围值
void ProgressArc::setRange(int minValue, int maxValue)
{
this->minValue = minValue;
this->maxValue = maxValue;
this->update();
}
//设置目标值
void ProgressArc::setValue(int value)
{
if(value>maxValue)
value = value%maxValue;
if(value<minValue)
value = minValue;
this->value = value;
this->update();
}
//设置百分比模式
void ProgressArc::setPercent(bool percent)
{
this->percent = percent;
this->update();
}
//设置圆弧宽度
void ProgressArc::setArcWidth(int arcWidth)
{
this->arcWidth = arcWidth;
this->update();
}
//设置标题
void ProgressArc::setText(const QString Text)
{
this->Text = Text;
this->update();
}
void ProgressArc::setData(int value,QString Text)
{
this->setValue(value);
this->setText(Text);
this->update();
}