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.csdn.net/download/wu10188/89101821
Qt中,如果你想要自定义QWidget的形状并重新绘制其外观,你可以使用 QPainter 和 QPainterPath 来实现图形绘制。以下是一个简化的步骤: 1. **继承自QWidget**:首先,你需要创建一个新的类并继承自QWidget,这样你就可以重写它的paintEvent()方法来处理绘画。 ```cpp class CustomShapeWidget : public QWidget { Q_OBJECT public: CustomShapeWidget(QWidget* parent = nullptr); protected: void paintEvent(QPaintEvent*) override; private: // 添加其他需要的成员变量和绘制工具 }; ``` 2. **QPainter和QPainterPath**:在paintEvent()方法中,创建一个QPainter对象并将其绑定到你的窗口。 ```cpp void CustomShapeWidget::paintEvent(QPaintEvent* event) { QPainter painter(this); // 使用QPainterPath绘制形状 } ``` 3. **绘制路径**:使用QPainterPath来定义你想要的形状,添加曲线、直线等,然后使用`painter.drawPath()`或`painter.fillPath()`来绘制或填充路径。 ```cpp void CustomShapeWidget::paintEvent(QPaintEvent* event) { QPainter painter(this); QPainterPath path; // 添加路径元素,如矩形、形、弧线等 path.addRect(QRectF(10, 10, 100, 100)); // 基本矩形示例 path.arcTo(QRectF(50, 50, 80, 80), 90, 90); // 弧形 // 使用路径进行绘制或填充 painter.drawPath(path); } ``` 4. **自定义样式**:如果你想更进一步,可以使用QStyleOption和QPainter的setPen()、setBrush()方法来自定义线条颜色、填充色等。 ```cpp void paintEvent(QPaintEvent* event) { // ... QStyleOption opt; initStyleOption(&opt); painter.setPen(opt.palette.color(QPalette::Window)); painter.drawPath(path); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值