QPainter QLinearGradient QPainterPath basic drawing drawn gradual progress bar (a)

First, the effect preview
Here Insert Picture Description
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
Published 30 original articles · won praise 1 · views 1167

Guess you like

Origin blog.csdn.net/u010906468/article/details/102826689