Qt使用QWidget重绘实现圆环形渐变色进度条(支持不确定进度模式)

效果如下:

纯竖直方向顶部蓝色到底部青色的渐变。

从左上角偏左45°到右下角偏右45°蓝色青色渐变。

从左上角偏左22.5°到右下角偏右22.5°蓝色青色渐变。(这个角度渐变最好看)

可以选择添加背景图片

支持两种模式:正常进度模式不确定进度模式

(在不确定进度模式下可以选择手动隐藏中间的文本)

另外组件的整体尺寸,圆环粗细,各部分颜色,字体都是可以随意调整的,还支持QWidget的QSS语句调整背景色,外边框等。

仅有两个文件:

circleprogressbar.h

#ifndef CIRCLEPROGRESSBAR_H
#define CIRCLEPROGRESSBAR_H

#include <QWidget>
#include <QPaintEvent>
#include <QFont>
#include <QColor>
#include <QTimer>

class CircleProgressBar : public QWidget
{
    Q_OBJECT
public:
    explicit CircleProgressBar(QWidget *parent = nullptr);

protected:
    // 重绘
    void paintEvent(QPaintEvent *event);

private:
    // 初始化
    void Init();

signals:
    // 调用setValue(int)导致当前进度值发送变化时发出此信号,没有变化时不会发出
    void valueChanged(int value);

public:
    // 设置进度值的最大值
    void setMaximum(int maximum=100);

    // 获取进度值的最大值
    int maximum();

    // 设置进度值的最小值
    void setMinimum(int minimum=0);

    // 获取进度值的最小值
    int minimum();

    // 设置进度值的最小值和最大值范围
    void setRange(int minimum=0, int maximum=100);

    // 设置当前进度值
    void setValue(int value);

    // 获取当前进度值
    int value();

    // 设置进度槽的宽度
    void setSlotWidth(int width=10);

    // 设置进度条的宽度
    void setBlockWidth(int width=10);

    // 设置进度槽的颜色
    void setSlotColor(const QColor &color);

    // 设置进度条的渐变起止颜色
    void setBlockColor(const QColor &colorBegin,const QColor &colorEnd);

    // 设置进度值文本是否可见
    void setTextVisible(bool visible);

    // 设置文本字体
    void setFont(const QFont &font);

    // 获取文本的字体
    QFont font();

    // 设置文本的颜色
    void setFontColor(const QColor &color);

    // 设置背景图片
    void setBackgroundPixmap(const QString &pic);

    // 设置背景图片是否可见
    void setBackgroundPixmapVisible(bool visible);

    // 使用不确定进度模式
    void setUncertainMode(bool enable);

    // 是否正处于不确定进度模式
    bool isUncertainMode();

    // 设置不确定进度模式滑块的度数跨度(仅限 0 - 360 之间的整数)
    void setUncertainModeSpanAngle(int spanAngle);

private slots:
    // 不去定进度模式下进度条旋转刷新
    void slot_UncertainModeAutoUpdate();

private:
    int m_SlotWidth;            // 进度槽宽度
    QColor m_SlotColor;         // 进度槽颜色

    int m_BlockWidth;           // 进度条宽度(进度条宽度一般要<=进度槽宽度)
    QColor m_BlockColorBegin;   // 进度条渐变开始颜色
    QColor m_BlockColorEnd;     // 进度条渐变结束颜色

    int m_Value;                // 当前进度值
    int m_Maximum;              // 最大值
    int m_Minimum;              // 最小值

    bool m_TextVisible;         // 文本是否可见
    QFont m_Font;               // 文本字体
    QColor m_FontColor;         // 文本颜色

    bool m_BgPixmapVisible;     // 背景图片是否可见
    QPixmap m_BgPixmap;         // 背景图片

    bool m_UncertainMode;       // 进度条为不确定模式
    int m_UncertainModeSpanAngle;// 不确定模式的角度跨度
    int m_UncertainModeAutoAngleCnt;// 不确定模式的起始角度
    QTimer m_UncertainModeUpdateTimer;// 不确定模式时用于定时刷新显示
};


#endif // CIRCLEPROGRESSBAR_H

circleprogressbar.cpp

源码Demo下载:

https://download.youkuaiyun.com/download/wu10188/89101821
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值