QPainter QLinearGradient QPainterPath 绘制渐进进度条 基本绘图(一)

一、效果预览图
在这里插入图片描述
二、代码构造思路
QPainter绘制背景图、QLinearGradient构造颜色渐变对象、QPainterPath绘制渐变填充区域
三、代码片段

#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
发布了30 篇原创文章 · 获赞 1 · 访问量 1167

猜你喜欢

转载自blog.csdn.net/u010906468/article/details/102826689