First, the effect preview
two, the code idea
QPainter drawing background, color gradient qlineargradient configuration objects, drawing QPainterPath gradient fill region
III snippet
#define PROGRESSBAR_H
#include <QObject>
#include <QWidget>
#include <QProgressBar>
#include <QLabel>
#include <QPainter>
#include <QStyleOption>
#include <QTimer>
class ProgressBar : public QWidget
{
Q_OBJECT
public:
ProgressBar(QWidget *parent = nullptr);
void updateTxtPos(int value);
protected:
void paintEvent(QPaintEvent *event);
private:
QLabel *label;
int m_curValue;
int m_min;
int m_max;
};
#endif // PROGRESSBAR_H
#include "progressbar.h"
#include <QDebug>
ProgressBar::ProgressBar(QWidget *parent) : QWidget(parent)
{
m_curValue = 0;
label = new QLabel(this);
label->setFixedSize(31,20);
label->setStyleSheet("font-family: MicrosoftYaHei;font-size:14px;color:#ffffff");
QTimer *timer = new QTimer;
connect(timer,&QTimer::timeout,this,[=](){
updateTxtPos(m_curValue);
m_curValue++;
if(m_curValue == 100)
m_curValue = 0;
});
timer->setInterval(20);
timer->start();
}
void ProgressBar::updateTxtPos(int value)
{
m_curValue = value;
this->update();
}
void ProgressBar::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QStyleOption opt;
opt.init(this);
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::HighQualityAntialiasing);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
QFont font = painter.font();
font.setFamily("Microsoft YaHei");
font.setPixelSize(14);
font.setBold(true);
painter.setFont(font);
//进度条背景
painter.save();
painter.setPen(Qt::NoPen);
painter.setBrush(QColor("#4DA0FF"));
painter.drawRoundedRect(0, 0, 310, 28, 14, 14);
painter.restore();
//进度条
painter.save();
int frontWidth = 310 * m_curValue / 100.0;
QLinearGradient linearGradient(0, 0, frontWidth, 28);
linearGradient.setColorAt(0, QColor("#FFDF00"));
linearGradient.setColorAt(1, QColor("#FF7700"));
painter.setPen(Qt::NoPen);
painter.setBrush(linearGradient);
QPainterPath path;
path.addRoundedRect(0, 0, 310, 28, 14, 14);
painter.setClipPath(path);
painter.drawRoundedRect(0, 0, frontWidth, 28, 14, 14);
painter.restore();
//进度
int textPosx = frontWidth - 45;
if (textPosx >= 0)
{
painter.setPen(Qt::white);
painter.drawText(130, 0, 40, 28, Qt::AlignCenter, QString::number(100 * m_curValue / 100.0, 'f', 0) + "%");
}
else
{
painter.setPen(Qt::white);
painter.drawText(130, 0, 40, 28, Qt::AlignCenter, QString::number(100 * m_curValue / 100.0, 'f', 0) + "%");
}
}
欢迎各方多多交流
QQ:519096571
e-mail:519096571@qq.com