【QT】音乐播放器demo

1、使用设计师模式绘制ui界面

添加QPushButton并设置大小,ctrl+鼠标拖动复制相同的组件。

添加icon //ps:icon下载网站

设置按钮无边框并设置鼠标悬停颜色:

修改QWidget样式表,添加:

复制代码
*{
border:none;
}
QPushButton:hover
{
	background-color: rgb(125, 238, 255);
}

2、widget源码设计

widget.h

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QtWidgets/QtWidgets>
#include<QMediaPlayer>
#include<QAudioOutput>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_4_clicked();

    void on_pushButton_3_clicked();

    void on_pushButton_5_clicked();

    void on_listWidget_currentRowChanged(int currentRow);

    void on_listWidget_doubleClicked(const QModelIndex &index);

private:
    Ui::Widget *ui;
    QList<QUrl> _playList;
    QAudioOutput *_audioOutput;
    QMediaPlayer *_mediaPlayer;
    int _curIndex=0;
};
#endif // WIDGET_H

widget.cpp

cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include<QtWidgets/QtWidgets>
#include<QMediaPlayer>
#include<QAudioOutput>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    _audioOutput=new QAudioOutput(this);
    _mediaPlayer=new QMediaPlayer(this);
    _mediaPlayer->setAudioOutput(_audioOutput);

    QObject::connect(_mediaPlayer,&QMediaPlayer::durationChanged,[&](qint64 duration){
        ui->totalLabel->setText(QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')).arg(duration/1000%60));
        ui->playCourseSlider->setRange(0,duration);
    });

    QObject::connect(_mediaPlayer,&QMediaPlayer::positionChanged,[&](qint64 pos){
        ui->curLabel->setText(QString("%1:%2").arg(pos/1000/60,2,10,QChar('0')).arg(pos/1000%60,2,10,QChar('0')));
        ui->playCourseSlider->setValue(pos);
    });

    connect(ui->playCourseSlider,&QSlider::sliderMoved,_mediaPlayer,&QMediaPlayer::setPosition);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    auto path=QFileDialog::getExistingDirectory(this,"请选择音乐所在的目录","C:/Users/31468/Desktop/");
    QDir dir(path);
    auto musicList=dir.entryList(QStringList()<<"*.mp3"<<"*.wav");
    ui->listWidget->addItems(musicList);
    ui->listWidget->setCurrentRow(0);

    for(auto &elem:musicList)
    {
        _playList.push_back(QUrl::fromLocalFile(path+"/"+elem));
    }
    qDebug()<<_playList;

}


void Widget::on_pushButton_4_clicked()
{
    if(_playList.size()==0) return;

    if(_mediaPlayer->playbackState()==QMediaPlayer::PlaybackState::StoppedState)
    {
        // QPushButton *button = new QPushButton(this);
        // // 设置按钮的背景图片,使用border-image属性
        // button->setStyleSheet("QPushButton { border-image: url(:/path/to/your/image.png); }");
        //:/icon/pause (2).png ://icon/stop.png
        ui->pushButton_4->setStyleSheet("QPushButton { border-image: url(:/icon/stop.png); }");
        _curIndex=ui->listWidget->currentRow();
        _mediaPlayer->setSource(_playList[_curIndex]);
        _mediaPlayer->play();
    }
    else if(_mediaPlayer->playbackState()==QMediaPlayer::PlaybackState::PlayingState)
    {
        ui->pushButton_4->setStyleSheet("QPushButton { border-image: url(:/icon/pause (2).png); }");
        _mediaPlayer->pause();
    }
    else if(_mediaPlayer->playbackState()==QMediaPlayer::PlaybackState::PausedState)
    {
        ui->pushButton_4->setStyleSheet("QPushButton { border-image: url(:/icon/stop.png); }");
        _mediaPlayer->play();
    }
}


void Widget::on_pushButton_3_clicked()//上一曲
{
    if(_playList.size()==0) return;
    --_curIndex;
    if(_curIndex==-1)
    {
        _curIndex=_playList.size()-1;
    }
    ui->listWidget->setCurrentRow(_curIndex);
    _mediaPlayer->setSource(_playList[_curIndex]);
    _mediaPlayer->play();
}


void Widget::on_pushButton_5_clicked()//下一曲
{
    if(_playList.size()==0) return;
    ++_curIndex;
    if(_curIndex==_playList.size())
    {
        _curIndex=0;
    }
    ui->listWidget->setCurrentRow(_curIndex);
    _mediaPlayer->setSource(_playList[_curIndex]);
    _mediaPlayer->play();

}
void Widget::on_listWidget_doubleClicked(const QModelIndex &index)
{
    _curIndex=index.row();
    //ui->listWidget->setCurrentRow(_curIndex);
    _mediaPlayer->setSource(_playList[_curIndex]);
    _mediaPlayer->play();
}


void Widget::on_listWidget_currentRowChanged(int currentRow)
{

}
相关推荐
白远山1 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
DevRay2 小时前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言
free-elcmacom2 小时前
C++学习<1>程序分区
开发语言·c++
醉颜凉2 小时前
Java 必看:如何彻底避免 HashMap 多线程死循环问题?
java·开发语言
默 语2 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
Brilliantwxx3 小时前
【STM32】 I2C_EEPROM_test 工程(实战篇)
开发语言·stm32·单片机·嵌入式硬件·ecmascript
清水白石0083 小时前
Python 异步编程深度解析:Cancellation 到底是异常还是控制信号?从 asyncio 取消机制到企业级事务设计最佳实践
开发语言·python
kolyle3 小时前
万级 QPS 下的 Token 分发系统架构:从 0 到 1 跑通 AI 时代的“水电煤“
开发语言·人工智能·系统架构·token·qps·极智词元·大模型私有化部署
caoerzhong3 小时前
JeeWMS 开源仓库管理系统 GPL-3.0 合规指南:Java WMS 二次开发前必须弄清的授权边界
java·开发语言·开源·vue
Patrick在香港3 小时前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据