#include "musicplayer.h"
#include "ui_musicplayer.h"
MusicPlayer::MusicPlayer(QWidget *parent) :
QWidget(parent),
ui(new Ui::MusicPlayer)
{
ui->setupUi(this);
init();
initConnect();
}
MusicPlayer::~MusicPlayer()
{
delete ui;
}
void MusicPlayer::slot_selectFile()
{
//打开目录,获取目录或文件
// fileName = QFileDialog::getOpenFileName(this,"选择音频文件","E:/Music","music(*.mp3);;movie(*.mp4)");
fileName = QFileDialog::getExistingDirectory(this,"选择文件夹","E:/Music");
if(!fileName.isEmpty())
{
//设置文件类型过滤
QDir dir(fileName);
QStringList filters;
filters<<"*.mp3"<<"*.mp4"<<"*.m4a"<<"*.wav"<<"*.flac";
dir.setNameFilters(filters);
//每次选择目录都会清空当前listwidget数据
ui->musicList->clear();
//遍历list获取过滤后的每一个文件名,放到listwidget中
fileList = dir.entryInfoList();
for(int i=0;i<fileList.size();i++)
{
QString filename = fileList[i].fileName();
ui->musicList->addItem(filename);
}
}
//当列表中无文件数据时禁止按钮点击
if(fileList.count()>=1)
{
ui->player->setEnabled(true);
ui->pause->setEnabled(true);
ui->preview->setEnabled(true);
ui->next->setEnabled(true);
ui->order->setEnabled(true);
ui->loop->setEnabled(true);
}
else
{
ui->player->setEnabled(false);
ui->pause->setEnabled(false);
ui->preview->setEnabled(false);
ui->next->setEnabled(false);
ui->order->setEnabled(false);
ui->loop->setEnabled(false);
}
}
void MusicPlayer::slot_playMusic()
{
if(!musicUrl.isEmpty())
{
//获取音频时长
player->setMedia(QUrl::fromLocalFile(musicUrl));
loadMusic();
}
}
void MusicPlayer::slot_mediaStatus(QMediaPlayer::MediaStatus status)
{
if(status == QMediaPlayer::EndOfMedia)
{
if(sortFlag == true)
{
m_index = ui->musicList->currentRow();
if(m_index <fileList.count()-1)
ui->musicList->setCurrentRow(m_index+1);
else if(m_index == fileList.count()-1)
ui->musicList->setCurrentRow(0);
}
}
else if(status == QMediaPlayer::BufferedMedia)
{
qint64 duration = player->duration();
int minutes = duration / 60000;
int remainSecond = (duration % 60000)/1000;
//初始化进度条
formattedTime = QString("%1:%2").arg(minutes,2,10,QChar('0')).arg(remainSecond,2,10,QChar('0'));
ui->timeCount->setText(QString("00:00/%1").arg(formattedTime));
}
}
void MusicPlayer::slot_getInfo(QListWidgetItem* item)
{
//获取音频文件名称
musicUrl = fileName + "/" +item->text();
}
void MusicPlayer::slot_durationChanged(qint64 duration)
{
ui->musicBar->setRange(0,duration);
}
void MusicPlayer::slot_valueChanged(int value)
{
player->setPosition(value);
}
void MusicPlayer::slot_positionChanged(qint64 position)
{
ui->musicBar->setValue(position);
int minutes = position / 60000;
int seconds = (position%60000)/1000;
ui->timeCount->setText(QString("%1:%2/%3").arg(minutes,2,10,QChar('0')).arg(seconds,2,10,QChar('0')).arg(formattedTime));
}
void MusicPlayer::slot_pause()
{
if(player->state() == QMediaPlayer::PlayingState)
{
player->pause();
ui->pause->setText("继续播放");
}
else if(player->state() == QMediaPlayer::PausedState)
{
player->play();
ui->pause->setText("暂停播放");
}
}
void MusicPlayer::slot_preview()
{
m_index = ui->musicList->currentRow()-1;
if(m_index == -1)
m_index = fileList.size()-1;
//将ListWidget中上一首进行选中,第一首会跳到最后一首
ui->musicList->setCurrentRow(m_index);
//获取上一首音频的文件名称
musicUrl = fileName + "/" +ui->musicList->item(m_index)->text();
slot_playMusic();
}
void MusicPlayer::slot_next()
{
m_index = ui->musicList->currentRow()+1;
if(m_index >= fileList.size())
m_index = 0;
//将ListWidget中下一首进行选中,最后一首点击时重头开始
ui->musicList->setCurrentRow(m_index);
//获取下一首音频的文件名称
musicUrl = fileName + "/" +ui->musicList->item(m_index)->text();
slot_playMusic();
}
//循环播放,只会将列表中当前选择的项以及后面的项依次进行播放
void MusicPlayer::slot_sortPlay()
{
m_index = ui->musicList->currentRow();
QMediaPlaylist* playlist = new QMediaPlaylist;
playlist->setPlaybackMode(QMediaPlaylist::Sequential);
qDebug()<<m_index;
for(int i = m_index+1;i<=fileList.size();i++)
{
ui->musicList->setCurrentRow(m_index);
musicUrl = fileName + "/" +ui->musicList->item(i-1)->text();
QUrl fileUrl = QUrl::fromLocalFile(musicUrl);
playlist->addMedia(fileUrl);
}
player->setPlaylist(playlist);
loadMusic();
sortFlag = true;
}
void MusicPlayer::slot_loopPlay()
{
QMediaPlaylist* playlist = new QMediaPlaylist;
playlist->setPlaybackMode(QMediaPlaylist::Loop);
musicUrl = fileName + "/" +ui->musicList->currentItem()->text();
QUrl fileUrl = QUrl::fromLocalFile(musicUrl);
playlist->addMedia(fileUrl);
player->setPlaylist(playlist);
loadMusic();
}
void MusicPlayer::init()
{
player = new QMediaPlayer();
ui->musicList->setSelectionMode(QAbstractItemView::SingleSelection);
}
void MusicPlayer::initConnect()
{
connect(ui->select,SIGNAL(clicked()),this,SLOT(slot_selectFile()));
connect(ui->player,SIGNAL(clicked()),this,SLOT(slot_playMusic()));
connect(ui->musicList,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(slot_getInfo(QListWidgetItem*)));
// connect(ui->musicBar,SIGNAL(valueChanged(int)),this,SLOT(slot_valueChanged(int)));
connect(ui->musicBar,SIGNAL(sliderMoved(int)),this,SLOT(slot_valueChanged(int)));
connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(slot_durationChanged(qint64)));
connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(slot_positionChanged(qint64)));
connect(ui->pause,SIGNAL(clicked()),this,SLOT(slot_pause()));
connect(ui->preview,SIGNAL(clicked()),this,SLOT(slot_preview()));
connect(ui->next,SIGNAL(clicked()),this,SLOT(slot_next()));
connect(ui->order,SIGNAL(clicked()),this,SLOT(slot_sortPlay()));
connect(ui->loop,SIGNAL(clicked()),this,SLOT(slot_loopPlay()));
connect(player,SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)),this,SLOT(slot_mediaStatus(QMediaPlayer::MediaStatus)));
}
void MusicPlayer::loadMusic()
{
//等待音频加载结束
while(player->mediaStatus()!=QMediaPlayer::LoadedMedia)
{
int ms = 100;
QEventLoop loop;
QTimer::singleShot(ms, &loop, &QEventLoop::quit);
loop.exec();
}
qint64 duration = player->duration();
int minutes = duration / 60000;
int remainSecond = (duration % 60000)/1000;
//初始化进度条
formattedTime = QString("%1:%2").arg(minutes,2,10,QChar('0')).arg(remainSecond,2,10,QChar('0'));
ui->timeCount->setText(QString("00:00/%1").arg(formattedTime));
player->play();
sortFlag = false;
qDebug()<<duration<<musicUrl<<formattedTime;
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于Qt的QMediaPlayer生成的音乐播放器
共59个文件
dll:30个
qm:20个
cpp:2个
需积分: 3 2 下载量 71 浏览量
2023-08-01
21:38:45
上传
评论 1
收藏 34.21MB ZIP 举报
温馨提示
使用Qt Creator生成的一个简单的音频播放器,支持MP3,m4a,flac和wav四种格式的音频文件,能进行单曲循环和顺序播放,支持上一首和下一首进行音频切换,资源中包括源码和源码打包的exe可执行程序。注意,没有视频播放功能,如果需要该功能还请自行添加,目前就是只能听音乐,进行音频播放!!!
资源推荐
资源详情
资源评论
收起资源包目录
QMusicPlayer.zip (59个子文件)
QMusicPlayer
QMusicPlayer可执行程序
libGLESV2.dll 2.4MB
vcredist_x64.exe 14.59MB
bearer
qnativewifibearer.dll 50KB
qgenericbearer.dll 47KB
styles
qwindowsvistastyle.dll 132KB
Qt5Gui.dll 5.98MB
imageformats
qjpeg.dll 324KB
qsvg.dll 26KB
qtga.dll 25KB
qtiff.dll 363KB
qwebp.dll 471KB
qgif.dll 32KB
qicns.dll 39KB
qwbmp.dll 24KB
qico.dll 33KB
Qt5Core.dll 5.58MB
Qt5Svg.dll 321KB
Qt5Widgets.dll 5.21MB
QMusicPlayer.exe 224KB
audio
qtaudio_windows.dll 57KB
qtaudio_wasapi.dll 91KB
translations
qt_lv.qm 150KB
qt_sk.qm 132KB
qt_cs.qm 186KB
qt_de.qm 197KB
qt_ja.qm 141KB
qt_fi.qm 184KB
qt_da.qm 179KB
qt_ko.qm 141KB
qt_fr.qm 178KB
qt_pl.qm 171KB
qt_it.qm 174KB
qt_bg.qm 175KB
qt_gd.qm 185KB
qt_es.qm 178KB
qt_en.qm 23B
qt_uk.qm 170KB
qt_ca.qm 189KB
qt_hu.qm 90KB
qt_he.qm 135KB
qt_ru.qm 181KB
iconengines
qsvgicon.dll 37KB
Qt5Multimedia.dll 703KB
platforms
qwindows.dll 1.35MB
libEGL.dll 15KB
opengl32sw.dll 19.95MB
Qt5Network.dll 1.17MB
D3Dcompiler_47.dll 3.98MB
playlistformats
qtmultimedia_m3u.dll 27KB
mediaservice
qtmedia_audioengine.dll 60KB
wmfengine.dll 53KB
dsengine.dll 248KB
QMusicPlayer
Mp3_Blue.ico 156KB
musicplayer.h 2KB
QMusicPlayer.pro.user 23KB
main.cpp 185B
QMusicPlayer.pro 1KB
musicplayer.ui 5KB
musicplayer.cpp 7KB
共 59 条
- 1
资源评论
冰封的雪绒
- 粉丝: 80
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功