Qt自定义麦克风界面,模拟音量大小

1、重写了进度条,继承自QWiget,调用绘图事件绘制自己需要的进度条。

2、需要自己在UI界面放一个widget,提升为这个类就行了。

头文件

#ifndef _VOICEPROGRESSBAR_H_
#define _VOICEPROGRESSBAR_H_

#include <QWidget>
#include <QPaintEvent>

class QTimer;
class VoiceProgressBar : public QWidget
{
    Q_OBJECT

public:
    VoiceProgressBar(QWidget *parent);
    ~VoiceProgressBar();

    //设置带色条矩形宽 高
    void setColorRectSize(int width, int height);

    //设置两个色条矩形之间的宽度
    void setColorRectSpace(int width);

    //设置进度条长 宽
    void setProgressBarSize(int width, int height);

    //设置进度条最大值
    void setMaxValue(float max = 100.0);

    //设置进度条最小值
    void setMinValue(float min = 0.0);

    //设置进度条当前值
    void setCurValue(float cur = 80.0);

    //初始化进度条
    void init();

    void setStart();
protected:
    void paintEvent(QPaintEvent *);
private:
    //进度条最小值
    float m_minValue;

    //进度条最大值
    float m_maxValue;

    //进度条当前值
    float m_curValue;

    //带色条矩形宽
    int m_colorRectWidth;

    //带色条矩形高
    int m_colorRectHeight;

    //整个进度条矩形宽
    int m_progressBarWidth;

    //整个进度条矩形高
    int m_progressBarHeight;

    //带色条之间间距
    int m_spaceWidth;

    QTimer *timer;

protected slots:
    void onTimeOut();

};

#endif // !_VOICEPROGRESSBAR_H_

 源文件

#include "VoiceProgressBar.h"
#include <QPainter>
#include <QTimer>
#include <QTime>

const int  PROGRESSBAR_WIDTH = 83;
const int  PROGRESSBAR_HEIGHT = 16;
const int  COLOR_RECT_WIDTH = 3;
const int  COLOR_RECT_HEIGHT = 16;
const int  COLOR_RECT_SPACE = 2;

VoiceProgressBar::VoiceProgressBar(QWidget *parent)
    : QWidget(parent)
    , m_minValue(0)
    , m_maxValue(0)
    , m_curValue(0)
    , m_colorRectWidth(0)
    , m_colorRectHeight(0)
    , m_progressBarWidth(0)
    , m_progressBarHeight(0)
    , m_spaceWidth(0)
    , timer(nullptr)
{
    // 设置当前窗口无标题栏
    setWindowFlags(Qt::FramelessWindowHint);

    // 设置当前窗口背景透明
    setAttribute(Qt::WA_TranslucentBackground);

    //初始化
    init();

    timer = new QTimer;
    timer->setInterval(100);
    connect(timer,&QTimer::timeout,this,&VoiceProgressBar::onTimeOut);
}

VoiceProgressBar::~VoiceProgressBar()
{
}

void VoiceProgressBar::init()
{
    setProgressBarSize(PROGRESSBAR_WIDTH*5, PROGRESSBAR_HEIGHT*5);

    setFixedSize(PROGRESSBAR_WIDTH*5, PROGRESSBAR_HEIGHT*5);

    setColorRectSize(COLOR_RECT_WIDTH*5, COLOR_RECT_HEIGHT*5);

    setColorRectSpace(COLOR_RECT_SPACE*5);

    setMaxValue();

    setMinValue();

    setCurValue();
}

void VoiceProgressBar::setStart()
{
    timer->start();
}

void VoiceProgressBar::setMaxValue(float max)
{
    m_maxValue = max;
}
void VoiceProgressBar::setMinValue(float min)
{
    m_minValue = min;
}

void VoiceProgressBar::setCurValue(float cur)
{
    m_curValue = cur;
    update();
}

void VoiceProgressBar::setColorRectSize(int width, int height)
{
    m_colorRectWidth = width;
    m_colorRectHeight = height;
}

void VoiceProgressBar::setProgressBarSize(int width, int height)
{
    m_progressBarWidth = width;
    m_progressBarHeight = height;
}

void VoiceProgressBar::setColorRectSpace(int width)
{
    m_spaceWidth = width;
}

void VoiceProgressBar::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    // 反走样
    painter.setRenderHint(QPainter::Antialiasing, true);

    // 设置渐变色
    QLinearGradient linear(0, 0, m_progressBarWidth, m_progressBarHeight);
    linear.setColorAt(0, QColor(145, 218, 204));
    linear.setColorAt(1, QColor(47, 141, 237));

    // 设置显示模式
    linear.setSpread(QGradient::PadSpread);

    // 设置画笔颜色、宽度
    painter.setPen(QPen(QColor(255, 255, 255, 0), 1));

    // 设置画刷填充
    painter.setBrush(QBrush(linear));

    // 绘制矩形
    painter.drawRect(QRect(0, 0, m_progressBarWidth, m_progressBarHeight));

    //设置画笔
    painter.setPen(QPen(QColor(255, 255, 255), 1));

    // 设置画刷填充
    painter.setBrush(QBrush(QColor(255, 255, 255)));

    //画中间白色矩形
    for (int i = m_colorRectWidth; i < m_progressBarWidth; i = i + m_spaceWidth + m_colorRectWidth)
    {
        painter.drawRect(QRect(i, 0, m_spaceWidth, m_colorRectHeight));
    }

    //计算百分比
    float percent = m_curValue / (m_maxValue - m_minValue);

    int perSize = m_progressBarWidth * percent;

    //设置画笔
    painter.setPen(QPen(QColor(255, 255, 255), 1));

    // 设置画刷填充
    painter.setBrush(QBrush(QColor(235, 238, 245)));

    int value = m_progressBarWidth;

    //画未到进度条
    for (; value > perSize; value = value - m_spaceWidth - m_colorRectWidth)
    {
        painter.drawRect(QRect(value - m_colorRectWidth, 0, m_colorRectWidth, m_colorRectHeight));
    }

}

void VoiceProgressBar::onTimeOut()
{
    QTime time;
    time= QTime::currentTime();
    qsrand(time.msec()+time.second()*1000);
    int n = qrand() % 100;    //产生100以内的随机数
    setCurValue(n);
}

 运行截图

大家觉得OK,请点个赞👍👍👍,谢谢。

  • 6
    点赞
  • 11
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

Mr.codeee

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值