【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)
{

}
相关推荐
软件黑马王子3 小时前
C#初级教程(4)——流程控制:从基础到实践
开发语言·c#
cpp_learners3 小时前
QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,压缩进度
qt·zlib·加密压缩·quazip
闲猫3 小时前
go orm GORM
开发语言·后端·golang
李白同学4 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
黑子哥呢?5 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
青龙小码农5 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿6 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
彳卸风6 小时前
Unable to parse timestamp value: “20250220135445“, expected format is
开发语言
数巨小码人7 小时前
QT SQL框架及QSqlDatabase类
jvm·sql·qt
dorabighead7 小时前
JavaScript 高级程序设计 读书笔记(第三章)
开发语言·javascript·ecmascript