Qt5QMediaPlayer音乐播放器
1、先上效果图:
好了,现在讲讲我是怎么写的吧,首先最基本的播放歌曲代码应该就是:QMediaPlayermusicnewQMediaPlayer(this);初始化音乐QMediaPlaylistplaylistnewQMediaPlaylist(this);初始化播放列表playlistsetPlaybackMode(QMediaPlaylist::Loop);设置播放模式(顺序播放,单曲循环,随机播放等)playlistaddMedia(QUrl::fromLocalFile(D:xxyymm。mp3));添加歌曲,这里添加的是歌曲的路径playlistaddMedia(QUrl::fromLocalFile(D:xxyymm2。mp3));添加歌曲,这里添加的是歌曲的路径musicsetPlaylist(playlist);设置播放列表musicplay();播放歌曲
这样就能按播放列表来播放了
然后playlist里面的歌曲是看不到的,就需要一个列表来显示歌曲,我用的是QListWidget,这样的话,只需要把列表项与playlist里面的歌曲对应上就可以了,然后要保存歌曲,数据库自然就少不了了,可以用Qt自带的数据库QSQLITE,然后创建数据库和表,写个函数
【领QT开发教程学习资料,点击下方链接莬费领取,先码住不迷路】
点击领取链接staticboolCreatConnection(){QSqlDatabasedbQSqlDatabase::addDatabase(QSQLITE);建库db。setDatabaseName(mymusic。db);给数据库起名字if(!db。open()){returnfalse;}QSqlQueryquery;query。exec(QString(createtableLocalMusic(idint,MusicNamevarchar,FileNamevarchar,primarykey(id,MusicName,FileName))));本地音乐列表数据,把歌曲名和歌曲路径给存起来returntrue;}
在main函数中先执行这个函数,创建个数据库即可。
添加歌曲:QListWidgetlistnewQListWidget(this);QSqlQueryquery;QStringListlistQFileDialog::getOpenFileNames(this,QString::fromLocal8Bit(文件),currentFileName〔1〕,QString::fromLocal8Bit(音频文件(。mp3)));用个文件登陆框来选择。mp3文件,包括多个文件if(!list。isEmpty()){for(inti0;ilist。size();i){QStringpathQDir::toNativeSeparators(list。at(i));playlistaddMedia(QUrl::fromLocalFile(path));QStringNamepath。split()。last();QListWidgetItemitemnewQListWidgetItem(QIcon(图片。png),Name);itemsetToolTip(Name);listaddItem(item);query。exec(QString(insertintovalues(1,2,3))。arg(i)。arg(Name)。arg(path);}}
这样就列表上就可以显示歌曲了,并且把歌曲信息保存到数据库里了,可以在初始化的时候把数据库的歌名添加到列表中即list,把歌曲路径添加到播放列表中即playlist,但是显示的歌曲如果太多就会出现滚动条,默认的滚动条貌似不是很好看,可以用一下代码美化滚动条QStringlistWidgetStyleQScrollBar:vertical{width:8px;backgroundcolor:transparent;margin:0px,0px,0px,0px;paddingtop:12px;上预留位置paddingbottom:12px;下预留位置}QScrollBar::handle:vertical{width:8px;backgroundcolor:rgba(255,255,255,0。2);borderradius:4px;minheight:20px;}QScrollBar::handle:vertical:hover{width:9px;backgroundcolor:rgba(255,255,255,0。5);borderradius:4px;minheight:20;}QScrollBar::addline:vertical{height:12px;width:10px;borderimage:url(:selectfilescroll3。png);subcontrolposition:bottom;}QScrollBar::subline:vertical{height:12px;width:10px;borderimage:url(:selectfilescroll1。png);subcontrolposition:top;}QScrollBar::addline:vertical:hover{height:12px;width:10px;borderimage:url(:selectfilescroll4。png);subcontrolposition:bottom;}QScrollBar::subline:vertical:hover{height:12px;width:10px;borderimage:url(:selectfilescroll2。png);subcontrolposition:top;}QScrollBar::addpage:vertical,QScrollBar::subpage:vertical{backgroundcolor:transparent;borderradius:4px;};uilistverticalScrollBar()setStyleSheet(listWidgetStyle);
然后就是得有个进度条,和歌曲时间
进度条,进度条自然是用QHorizontalSlider了,主要就是歌曲进度得随着播放进度变化,所以可以使用信号和槽,QMediaPlayer有两个信号,QMediaPlayer::positionChanged和QMediaPlayer::durationChanged,分别是当前歌曲播放位置的变化,和切换歌曲时的歌曲长度,那么就需要写两个槽来接收这两个信号了1。voidWidget::updatePosition(qint64position)接收歌曲位置改变,那么滑块的位置也要变{uihorizontalSlidersetValue(position);设置滑块位置}2voidWidget::updateDuration(qint64duration)更新播放歌曲的时间{uihorizontalSlidersetRange(0,duration);根据播放时长来设置滑块的范围uihorizontalSlidersetEnabled(duration0);uihorizontalSlidersetPageStep(duration10);以及每一步的步数}
然后将他们连接就可以了connect(music,QMediaPlayer::positionChanged,this,Widget::updatePosition);connect(music,QMediaPlayer::durationChanged,this,Widget::updateDuration);
还有就是列表选中的歌曲也要跟着playlist的歌曲变化来变化,需要利用QMediaPlaylist::currentIndexChanged信号,故写槽:voidWidget::updateList(intvalue){uilistitem(value)setSelected(true);}
然后connect(playlist,QMediaPlaylist::currentIndexChanged,this,Widget::updateList);
播放暂停的话就直接点播放个按钮就musicplay();点个暂停按钮就musicpuase();
然后还有就是时间的转换,mp3的时间是用毫秒来算的,那么就要变成分钟:秒的格式,可以写个函数来转换:staticQStringTime(qint64time)转换时间{qint64secondstime1000;constqint64minutesseconds60;secondsminutes60;returnQStringLiteral(1:2)。arg(minutes,2,10,QLatin1Char(0))。arg(seconds,2,10,QLatin1Char(0));}
然后还有播放模式,其实就是为playlist设置播放模式就可以了,比如顺序播放playlistsetPlaybackMode(QMediaPlaylist::Loop);
单曲循环playlistsetPlaybackMode(QMediaPlaylist::CurrentItemInLoop);,随机播放playlistsetPlaybackMode(QMediaPlaylist::Random);等
上一首和下一首也很容易
上一首:当上一首按钮点击执行voidWidget::preMusic(){introwplaylistmediaCount();获取歌曲数量intcurrentplaylistcurrentIndex();获取当前位置if(current0){current0;}playlistsetCurrentIndex(current);设置当前音乐uilistscrollToItem(uilistitem(current));滚动到当前音乐musicplay();播放}
下一首:点击下一首按钮时执行voidWidget::nextMusic(){introwplaylistmediaCount();获取歌曲数量intcurrentplaylistcurrentIndex();获取当前位置if(currentrow){current0;}playlistsetCurrentIndex(current);设置当前音乐uilistscrollToItem(uilistitem(current));滚动到当前音乐musicplay();播放}
歌曲定位也很好做,歌曲定位:点击歌曲定位按钮执行voidgetIndex(){uilistitem(playlistcurrentIndex())setSelected(true);}
基本这样就可以做出来了。