Qt5+QMediaPlayer實(shí)現(xiàn)音樂播放器的示例代碼
1、先上效果圖
好了,現(xiàn)在講講我是怎么寫的吧,首先最基本的播放歌曲代碼應(yīng)該就是:
好了,現(xiàn)在講講我是怎么寫的吧,首先最基本的播放歌曲代碼應(yīng)該就是:
QMediaPlayer *music = new QMediaPlayer(this);//初始化音樂 QMediaPlaylist *playlist = new QMediaPlaylist(this);//初始化播放列表 playlist->setPlaybackMode(QMediaPlaylist::Loop);//設(shè)置播放模式(順序播放,單曲循環(huán),隨機(jī)播放等) playlist->addMedia(QUrl::fromLocalFile("D:/xx/yy/mm.mp3"));//添加歌曲,這里添加的是歌曲的路徑 playlist->addMedia(QUrl::fromLocalFile("D:/xx/yy/mm2.mp3"));//添加歌曲,這里添加的是歌曲的路徑 music->setPlaylist(playlist); //設(shè)置播放列表 music->play();//播放歌曲
這樣就能按播放列表來播放了
然后playlist里面的歌曲是看不到的,就需要一個(gè)列表來顯示歌曲,我用的是QListWidget,這樣的話,只需要把列表項(xiàng)與playlist里面的歌曲對應(yīng)上就可以了,然后要保存歌曲,數(shù)據(jù)庫自然就少不了了,可以用Qt自帶的數(shù)據(jù)庫QSQLITE,然后創(chuàng)建數(shù)據(jù)庫和表,寫個(gè)函數(shù)
static bool CreatConnection() { QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");//建庫 db.setDatabaseName("mymusic.db");//給數(shù)據(jù)庫起名字 if(!db.open()) { return false; } QSqlQuery query; query.exec(QString("create table LocalMusic (id int,MusicName varchar,FileName varchar, primary key(id,MusicName,FileName))"));//本地音樂列表數(shù)據(jù),把歌曲名和歌曲路徑給存起來 return true; }
在main函數(shù)中先執(zhí)行這個(gè)函數(shù),創(chuàng)建個(gè)數(shù)據(jù)庫即可。
添加歌曲:
QListWidget *list = new QListWidget(this); QSqlQuery query; QStringList list=QFileDialog::getOpenFileNames(this,QString::fromLocal8Bit("文 件"),currentFileName[1],QString::fromLocal8Bit("音頻文件(*.mp3)"));//用個(gè)文件登陸框來選擇.mp3文件,包括多個(gè)文件 if(!list.isEmpty()){ for(int i=0;i<list.size();i++){ QString path=QDir::toNativeSeparators(list.at(i)); playlist->addMedia(QUrl::fromLocalFile(path)); QString Name=path.split("\\").last(); QListWidgetItem *item = new QListWidgetItem(QIcon("圖片.png"),Name); item->setToolTip(Name); list->addItem(item); query.exec(QString("insert into values(%1,'%2','%3')").arg(i).arg(Name).arg(path); } }
這樣就列表上就可以顯示歌曲了,并且把歌曲信息保存到數(shù)據(jù)庫里了,可以在初始化的時(shí)候把數(shù)據(jù)庫的歌名添加到列表中即list,把歌曲路徑添加到播放列表中即playlist,但是顯示的歌曲如果太多就會出現(xiàn)滾動條,默認(rèn)的滾動條貌似不是很好看,可以用一下代碼美化滾動條
QString listWidgetStyle = "QScrollBar:vertical" "{" "width:8px;" "background-color:transparent;" "margin:0px,0px,0px,0px;" " padding-top:12px; /*上預(yù)留位置*/" " padding-bottom:12px; /*下預(yù)留位置*/" "}" "QScrollBar::handle:vertical" " {" " width:8px;" " background-color:rgba(255,255,255,0.2);" " border-radius:4px;" " min-height:20px;" " }" "QScrollBar::handle:vertical:hover" "{" " width:9px;" " background-color:rgba(255,255,255,0.5);" " border-radius:4px;" " min-height:20;" "}" "QScrollBar::add-line:vertical" "{" " height:12px;" " width:10px;" " border-image:url(:/selectfile/scroll/3.png);" " subcontrol-position:bottom;" "}" "QScrollBar::sub-line:vertical" "{" " height:12px;" " width:10px;" " border-image:url(:/selectfile/scroll/1.png);" " subcontrol-position:top;" "}" "QScrollBar::add-line:vertical:hover" "{" " height:12px;" " width:10px;" " border-image:url(:/selectfile/scroll/4.png);" " subcontrol-position:bottom;" " }" " QScrollBar::sub-line:vertical:hover" " {" " height:12px;" " width:10px;" " border-image:url(:/selectfile/scroll/2.png);" " subcontrol-position:top;" " }" " QScrollBar::add-page:vertical," "QScrollBar::sub-page:vertical" " {" " background-color:transparent;" " border-radius:4px;" "}"; ui->list->verticalScrollBar()->setStyleSheet(listWidgetStyle);
然后就是得有個(gè)進(jìn)度條,和歌曲時(shí)間
進(jìn)度條,進(jìn)度條自然是用QHorizontalSlider了,主要就是歌曲進(jìn)度得隨著播放進(jìn)度變化,所以可以使用信號和槽,QMediaPlayer有兩個(gè)信號,QMediaPlayer::positionChanged和QMediaPlayer::durationChanged,分別是當(dāng)前歌曲播放位置的變化,和切換歌曲時(shí)的歌曲長度,那么就需要寫兩個(gè)槽來接收這兩個(gè)信號了
//1. void Widget::updatePosition(qint64 position)//接收歌曲位置改變,那么滑塊的位置也要變 { ui->horizontalSlider->setValue(position);//設(shè)置滑塊位置 } //2 void Widget::updateDuration(qint64 duration)//更新播放歌曲的時(shí)間 { ui->horizontalSlider->setRange(0,duration);//根據(jù)播放時(shí)長來設(shè)置滑塊的范圍 ui->horizontalSlider->setEnabled(duration>0); ui->horizontalSlider->setPageStep(duration/10);//以及每一步的步數(shù) }
然后將他們連接就可以了
connect(music,&QMediaPlayer::positionChanged,this,&Widget::updatePosition); connect(music,&QMediaPlayer::durationChanged,this,&Widget::updateDuration);
還有就是列表選中的歌曲也要跟著playlist的歌曲變化來變化,需要利用QMediaPlaylist::currentIndexChanged信號,故寫槽:
void Widget::updateList(int value){ ui->list->item(value)->setSelected(true); }
然后connect(playlist,&QMediaPlaylist::currentIndexChanged,this,&Widget::updateList);
播放暫停的話就直接點(diǎn)播放個(gè)按鈕就music->play();點(diǎn)個(gè)暫停按鈕就music->puase();
然后還有就是時(shí)間的轉(zhuǎn)換,mp3的時(shí)間是用毫秒來算的,那么就要變成 分鐘:秒 的格式,可以寫個(gè)函數(shù)來轉(zhuǎn)換:
static QString Time(qint64 time)//轉(zhuǎn)換時(shí)間 { qint64 seconds=time/1000; const qint64 minutes=seconds/60; seconds-=minutes*60; return QStringLiteral("%1:%2") .arg(minutes, 2, 10, QLatin1Char('0')) .arg(seconds, 2, 10, QLatin1Char('0')); }
然后還有播放模式,其實(shí)就是為playlist設(shè)置播放模式就可以了,比如順序播放playlist->setPlaybackMode(QMediaPlaylist::Loop);
單曲循環(huán)playlist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);,隨機(jī)播放playlist->setPlaybackMode(QMediaPlaylist::Random);等
上一首和下一首也很容易
上一首:當(dāng)上一首按鈕點(diǎn)擊執(zhí)行
void Widget::preMusic(){ int row = playlist->mediaCount();//獲取歌曲數(shù)量 int current = playlist->currentIndex();//獲取當(dāng)前位置 if(--current<0){ current=0; } playlist->setCurrentIndex(current);//設(shè)置當(dāng)前音樂 ui->list->scrollToItem(ui->list->item(current));//滾動到當(dāng)前音樂 music->play();//播放 }
下一首:點(diǎn)擊下一首按鈕時(shí)執(zhí)行
void Widget::nextMusic(){ int row = playlist->mediaCount();//獲取歌曲數(shù)量 int current = playlist->currentIndex();//獲取當(dāng)前位置 if(++current>row){ current=0; } playlist->setCurrentIndex(current);//設(shè)置當(dāng)前音樂 ui->list->scrollToItem(ui->list->item(current));//滾動到當(dāng)前音樂 music->play();//播放 }
歌曲定位也很好做,歌曲定位:點(diǎn)擊歌曲定位按鈕執(zhí)行
void getIndex(){ ui->list->item(playlist->currentIndex())->setSelected(true); }
基本這樣就可以做出來了。
到此這篇關(guān)于Qt5+QMediaPlayer實(shí)現(xiàn)音樂播放器的示例代碼的文章就介紹到這了,更多相關(guān)Qt5 MediaPlayer音樂播放器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用C++類實(shí)現(xiàn)單向鏈表的增刪查和反轉(zhuǎn)操作方法
下面小編就為大家?guī)硪黄肅++類實(shí)現(xiàn)單向鏈表的增刪查和反轉(zhuǎn)操作方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04C語言實(shí)現(xiàn)linux網(wǎng)卡檢測精簡版
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)linux網(wǎng)卡檢測的精簡版,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06C++中如何將operator==定義為類的成員函數(shù)
這篇文章主要介紹了C++中如何將operator==定義為類的成員函數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01C++精要分析右值引用與完美轉(zhuǎn)發(fā)的應(yīng)用
C++11標(biāo)準(zhǔn)為C++引入右值引用語法的同時(shí),還解決了一個(gè)短板,即使用簡單的方式即可在函數(shù)模板中實(shí)現(xiàn)參數(shù)的完美轉(zhuǎn)發(fā)。那么,什么是完美轉(zhuǎn)發(fā)?它為什么是C++98/03 標(biāo)準(zhǔn)存在的一個(gè)短板?C++11標(biāo)準(zhǔn)又是如何為C++彌補(bǔ)這一短板的?別急,本節(jié)將就這些問題給讀者做一一講解2022-05-05C++數(shù)據(jù)精度問題的解決方案(對浮點(diǎn)數(shù)保存指定位小數(shù))
對浮點(diǎn)數(shù)保存指定位小數(shù),怎么解決這個(gè)問題呢?如果有小伙伴對C++數(shù)據(jù)精度問題的解決方案感興趣的朋友一起看看吧2017-08-08C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?
今天小編就為大家分享一篇關(guān)于C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04