仿照b站音量调节效果

b站效果:

Qt仿制效果图:

实现步骤:

1、绘制背景、绘制矩形、填充颜色

2、难点在于鼠标悬浮所在的矩形需要调整绘制区域,重点看for循环;

1、头文件

#pragma once
#include <QWidget>

class Value : public QWidget
{
    Q_OBJECT

public:
    Value(QWidget * parent = 0);
    ~Value();

    void SetMaxValue(int Value);
    void SetCurrentValue(int Value);
    void SetValueNum(int count);
protected:
    int m_maxValue;//最大值
    int m_Value;//当前值
    int m_mouseCurPos;//鼠标位置
    int m_isPress;
    int m_nValueNumber;//音量条数量
    virtual void mousePressEvent(QMouseEvent *);
    virtual void mouseMoveEvent(QMouseEvent *);
    virtual void mouseReleaseEvent(QMouseEvent *);
    virtual void leaveEvent(QEvent *);
    virtual void paintEvent(QPaintEvent *);

signals:
    void signal_valueChange(int value);
private:

};

2、实现文件

#include "value.h"

#include <QImage>
#include <QBitmap>
#include <QPainter>
#include <QMouseEvent>
#define RECT_Y_RATE 0.2
#define RECT_HEIGHT_RATE 0.8
Value::Value(QWidget * parent) : QWidget(parent),
    m_maxValue(100),
    m_Value(0),
    m_isPress(false),
    m_mouseCurPos(50),
    m_nValueNumber(10)
{
    setMouseTracking(true);
}

Value::~Value() = default;

void Value::SetMaxValue(int Value)
{
    m_maxValue = Value;
}

void Value::SetCurrentValue(int Value)
{
    m_Value = Value * width() / m_maxValue;
    update();
}

void Value::SetValueNum(int count)
{
    m_nValueNumber = count;
}

void Value::mousePressEvent(QMouseEvent *event)
{
    m_isPress = true;
    if(event->pos().x() >= 0 && event->pos().x() <= width()) {
        m_mouseCurPos = event->pos().x();
        m_Value = event->pos().x();
    }
    update();
}

void Value::mouseMoveEvent(QMouseEvent *event)
{
    if(event->pos().x() >= 0 && event->pos().x() <= width()) {
        m_mouseCurPos = event->pos().x();
        if(m_isPress) {
            m_Value = event->pos().x();
        }
    }
    update();
}

void Value::mouseReleaseEvent(QMouseEvent *event)
{
	if (m_isPress) {
		m_isPress = false;
		emit signal_valueChange(m_Value * m_maxValue / width());
	}
}

void Value::leaveEvent(QEvent *event)
{
    m_mouseCurPos = width();
    update();
}

void Value::paintEvent(QPaintEvent *)
{
    QPainter painter;
	painter.setRenderHint(QPainter::Antialiasing);
    painter.begin(this);
    painter.fillRect(rect(), QColor(27, 28, 30, 0.8));
    painter.end();

	int nWidth = width(), nHeight = height();
    QImage mask(nWidth, nHeight, QImage::Format_ARGB32);
    painter.begin(&mask);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(0, 0, 0));
    mask.fill(QColor(255, 255, 255, 0));

    int scaleFlag = m_mouseCurPos * m_nValueNumber / nWidth;//计算鼠标所在的区域
	for (int i = 0; i < m_nValueNumber; ++i) {
		if (i == scaleFlag) {
			painter.drawRect(
				QRectF((nWidth / m_nValueNumber) * i + nWidth / (m_nValueNumber * 4)/*增加偏移*/,
					0,
					nWidth / (m_nValueNumber * 2),
					nHeight * RECT_HEIGHT_RATE));

		}
		else {
			painter.drawRect(
				QRectF((nWidth / m_nValueNumber) * i + nWidth / (m_nValueNumber * 4),
					nHeight * RECT_Y_RATE,
					nWidth / (m_nValueNumber * 2),
					nHeight * RECT_HEIGHT_RATE));
		}
	}

    painter.end();
    painter.begin(this);
    painter.setRenderHint(QPainter::Antialiasing, true);
    QRegion region(QBitmap::fromImage(mask));
    painter.setClipRegion(region);

    painter.fillRect(QRect(0, 0, nWidth, nHeight), QColor("#979797"));
    painter.fillRect(QRect(0, 0, m_Value, nHeight), QColor("#3073F4"));
    painter.end();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt中,可以使用QMediaPlayer类来实现音乐播放功能,并且可以通过设置音量属性来调节音量。以下是一个简单的示例代码,演示了如何使用QMediaPlayer类来创建一个音乐播放器并实现音量调节功能: ```cpp #include <QtWidgets> #include <QMediaPlayer> class MusicPlayer : public QWidget { Q_OBJECT public: MusicPlayer(QWidget *parent = nullptr) : QWidget(parent) { // 创建音乐播放器 player = new QMediaPlayer(this); // 创建音量滑动条 volumeSlider = new QSlider(Qt::Horizontal, this); volumeSlider->setRange(0, 100); // 设置音量范围 volumeSlider->setValue(50); // 设置初始音量为50 // 连接音量滑动条的valueChanged信号到槽函数 connect(volumeSlider, &QSlider::valueChanged, player, &QMediaPlayer::setVolume); // 创建布局 QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(volumeSlider); setLayout(layout); } private: QMediaPlayer *player; QSlider *volumeSlider; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MusicPlayer musicPlayer; musicPlayer.show(); return app.exec(); } #include "main.moc" ``` 在上述代码中,我们创建了一个MusicPlayer类继承自QWidget,并在构造函数中创建了一个QMediaPlayer对象和一个QSlider对象。通过连接QSlider的valueChanged信号到QMediaPlayer的setVolume槽函数,实现了音量调节功能。 注意:要使用此代码,需要在.pro文件中添加`QT += widgets`。 希望这个示例能帮助到你实现Qt音乐播放器的音量调节功能!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二丶九

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值