亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Qt之音樂播放器一

2019-11-10 18:16:31
字體:
來源:轉載
供稿:網友

1、實現播放歌曲

void Widget::on_playMusicButton_clicked()//點擊播放歌曲按鈕{    if(currentSongIndex > songIdList.size())        return;    currentSongInfo = this->getSongRealLinkById(songIdList.at(currentSongIndex));    mediaPlayer->setMedia(QUrl(currentSongInfo.songRealLink));    mediaPlayer->play();    QString lyric = this->getLyric(currentSongInfo.lyricLink);//從網上獲取歌詞    lyricList = this->parse(lyric);//將lyric一行行地解析到lyricList}//1、獲取頻道列表QList<CHANNEL_INFO> Widget::getChannelList(){    const QString channelUrl = "http://fm.baidu.com/dev/api/?tn=channellist";    QList<CHANNEL_INFO> channelInfoList;    QNetworkRequest networkRequest;    QNetworkaccessManager *networkManager = new QNetworkAccessManager;    networkRequest.setUrl(QUrl(channelUrl));    networkManager->setCookieJar(0);    QNetworkReply *reply = networkManager->get(networkRequest);    QEventLoop loop;    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));    loop.exec();    reply->deleteLater();    QByteArray buf = reply->readAll();    QJsonParseError jsonError;    QJsonDocument jsonRes = QJsonDocument::fromJson(buf, &jsonError);;    if(jsonError.error == QJsonParseError::NoError)    {        if(jsonRes.isObject())        {            QVariantMap result = jsonRes.toVariant().toMap();//提取花括號里的鍵值對            foreach(QVariant channel, result["channel_list"].toList())//提取[]里的頻道            {   //由于每個頻道也是一個{}                QVariantMap channelMap = channel.toMap();//提取花括號的鍵值對                CHANNEL_INFO channelInfo;                channelInfo.channelId = channelMap["channel_id"].toString();                channelInfo.channelName = channelMap["channel_name"].toString();                channelInfoList.append(channelInfo);            }        }    }    return channelInfoList;}//2、根據頻道id,獲取某個頻道下的歌曲列表(比如推薦頻道public_tuijian_sPRing)QList<QString> Widget::getSongIdList(QString channelId){    const QString playListUrl = "http://fm.baidu.com/dev/api/?tn=playlist&format=json&id=";    QNetworkRequest networkRequest;    QNetworkAccessManager *networkManager = new QNetworkAccessManager;    networkRequest.setUrl(QUrl(playListUrl + channelId));    networkManager->setCookieJar(0);    QNetworkReply *reply = networkManager->get(networkRequest);    QEventLoop loop;    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));    loop.exec();    reply->deleteLater();    QList<QString> songId;    QByteArray buf = reply->readAll();    QJsonParseError jsonError;    QJsonDocument jsonRes = QJsonDocument::fromJson(buf, &jsonError);;    if(jsonError.error == QJsonParseError::NoError)    {        if(jsonRes.isObject())        {            QVariantMap result = jsonRes.toVariant().toMap();            foreach(QVariant song, result["list"].toList())            {                QVariantMap songMap = song.toMap();                QString id = songMap["id"].toString();//獲取歌曲id                //如果歌曲ID有效                if(!id.isEmpty())                {                    songId.append(id);                }            }        }    }    return songId;}//3、根據songID(比如1615837),獲取一首歌的歌曲名稱和下載鏈接SONG_INFO Widget::getSongRealLinkById(QString songId){    const QString downLoadLinkUrl = "http://music.baidu.com/data/music/fmlink?type=mp3&rate=320&songIds=";    QNetworkRequest networkRequest;    QNetworkAccessManager networkManager;    networkRequest.setUrl(QUrl(downLoadLinkUrl + songId));    networkManager.setCookieJar(0);    QNetworkReply *reply = networkManager.get(networkRequest);    QEventLoop loop;    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));    loop.exec();    reply->deleteLater();    //歌曲信息    SONG_INFO songInfo;    QByteArray buf = reply->readAll();    QJsonParseError jsonError;    QJsonDocument jsonRes = QJsonDocument::fromJson(buf, &jsonError);;    if(jsonError.error == QJsonParseError::NoError)    {        if(jsonRes.isObject())        {            QVariantMap result = jsonRes.toVariant().toMap();            QVariantMap dataList = result["data"].toMap();            foreach(QVariant data, dataList["songList"].toList())            {                QVariantMap linkMap = data.toMap();                songInfo.songRealLink = linkMap["songLink"].toString();                songInfo.songName = linkMap["songName"].toString();                songInfo.artistName = linkMap["artistName"].toString();                songInfo.songPicSmall = linkMap["songPicSmall"].toString();                songInfo.songPicRadio = linkMap["songPicRadio"].toString();                songInfo.albumName = linkMap["albumName"].toString();                songInfo.lyricLink = linkMap["lrcLink"].toString();            }        }    }    return songInfo;}

2、實現歌詞顯示

//根據lrcLink獲取歌詞QString Widget::getLyric(QString lyricLink)//lyricLink是歌詞下載地址{    QNetworkRequest networkRequest;    QNetworkAccessManager networkManager;    networkRequest.setUrl(QUrl(lyricLink));    QNetworkReply *reply = networkManager.get(networkRequest);    QEventLoop loop;    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));    loop.exec();    reply->deleteLater();    QString lyrc;    lyrc = reply->readAll();    return lyrc;}//解析從網上獲取的歌詞QList<QLyric> Widget::parse(QString lyric){    QTextStream stream(&lyric);    QTextCodec *codec = QTextCodec::codecForName("utf-8");    stream.setCodec(codec);    currentLyricIndex = 0;    lyricList.clear();    //QRegExp解析歌詞    QRegExp timeExp;    timeExp.setPatternSyntax(QRegExp::RegExp);    timeExp.setCaseSensitivity(Qt::CaseSensitive);    timeExp.setPattern("//[([0-9]{2}):([0-9]{2})//.([0-9]{2})//]");    //匹配[00:02.42]    QList<QLyric> result;    while (!stream.atEnd())    {        QString line = stream.readLine();        int ret = timeExp.indexIn(line);        QList<QTime> ticks;        int lastindex = 0;        while (ret >= 0)        {            QStringList tstr = timeExp.capturedTexts();            QTime time(0, tstr[1].toInt(), tstr[2].toInt(), tstr[3].toInt());            ticks.append(time);            lastindex = ret + timeExp.matchedLength();            ret = timeExp.indexIn(line, lastindex);        }//經過測試,ticks只會含有一個項        QString lyricstr = line.right(line.size() - lastindex);//提取歌詞        for (const QTime& t : ticks)//c++11        {            QLyric lyric;            lyric.time = t.minute() * 60 * 1000 + t.second() * 1000 + t.msec();//單位ms            lyric.lyric = lyricstr;            result.append(lyric);        }    }    std::sort(result.begin(), result.end(), [] (const QLyric& a, const QLyric& b) -> bool {        return a.time < b.time;    });    return result;//保存了一行行的歌詞}//顯示歌詞的槽函數void Widget::slotShowLyric(qint64 position){    if(lyricList.size() <= 0 || currentLyricIndex >= lyricList.size())        return;    for(int i = 0; i < lyricList.size(); i++)    {        if(position > lyricList.at(i).time)        {            currentLyricIndex = i;        }    }    //顯示position之后的歌詞,position之前的已經播放過了    if(position > lyricList.at(currentLyricIndex).time)    {        //始終顯示作者名和歌曲名        QString lrc;        lrc.clear();        lrc += QString("<p align='center'><span style=' font-style:italic;'>");        lrc += currentSongInfo.artistName + " - " + currentSongInfo.songName;        lrc += QString("</span></p>");        //j從m_iCurrentIndex - 1開始,是為了顯示出正在唱的前一句        for(int j = currentLyricIndex - 1; j < lyricList.size(); j++)        {            if(j < 0)                continue;            if(currentLyricIndex == j)//正在唱的歌詞,顏色加粗            {                lrc += QString("<p align='center'><span style=' font-weight:600;'>");                lrc += lyricList.at(currentLyricIndex).lyric;                lrc += QString("</span></p>");            }            else            {                lrc += "<p align='center'>";                lrc += lyricList.at(j).lyric;                lrc += "</p>";            }        }        ui->lyricLabel->setText(lrc);        currentLyricIndex++;    }}

3、實現歌曲下載

void Widget::on_downLoadButton_clicked()//點擊下載歌曲按鈕{    QString fileName;    QDir dir;    if(!dir.exists("./download"))    {        dir.mkdir("./download");    }    fileName = "./download/" + currentSongInfo.songName + ".mp3";    this->downLoadMusic(fileName, currentSongInfo.songRealLink);}//從網上下載歌曲,fileName是下載之后文件名(含路徑),url是歌曲下載鏈接void Widget::downLoadMusic(QString fileName, QString songLink){    QNetworkRequest networkRequest;    QNetworkAccessManager networkManager;    networkRequest.setUrl(QUrl(songLink));    QNetworkReply *reply = networkManager.get(networkRequest);    QEventLoop loop;    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));    loop.exec();    reply->deleteLater();    QFile file;    file.setFileName(fileName);    bool ok = file.open(QIODevice::WriteOnly);    if(ok)    {        file.write(reply->readAll());    }}完整代碼下載:http://download.csdn.net/detail/bladeandmaster88/9749987
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www国产亚洲精品久久网站| 欧美一级大片视频| 亚洲欧美日韩一区二区在线| 久久久免费高清电视剧观看| 久久精品99久久久久久久久| 亚洲天堂av图片| 久久69精品久久久久久久电影好| 亚洲福利视频免费观看| 亚洲成人a**站| 日韩一区二区在线视频| 久久久久久国产精品三级玉女聊斋| 亚洲欧洲av一区二区| 欧美亚州一区二区三区| 日韩麻豆第一页| 国产在线视频不卡| 日本老师69xxx| 2021久久精品国产99国产精品| 国产精品永久免费| 亚洲美腿欧美激情另类| 欧美高清一级大片| 成人在线播放av| 欧美成人三级视频网站| 在线观看日韩av| 亚洲第一精品自拍| 亚洲精品国精品久久99热一| 久久精品成人欧美大片古装| 激情懂色av一区av二区av| 国产精品日韩在线一区| 亚洲精品www久久久久久广东| 欧美大学生性色视频| 欧美成人一区在线| 国产精品91在线观看| 亚洲精品乱码久久久久久按摩观| 亚洲一区免费网站| 国产成人精品最新| 青草成人免费视频| 欧美激情精品在线| 久久中文久久字幕| 日韩欧美aaa| 日韩在线中文视频| 精品视频久久久久久| 久热国产精品视频| 国产精品白嫩初高中害羞小美女| 伊人男人综合视频网| 久久免费少妇高潮久久精品99| 91色精品视频在线| 亚洲美女又黄又爽在线观看| 久久精品国产亚洲7777| 色噜噜狠狠狠综合曰曰曰88av| 亚洲欧美国产高清va在线播| 不卡在线观看电视剧完整版| 国产精品jvid在线观看蜜臀| 亚洲欧美另类中文字幕| 日韩禁在线播放| 欧美激情videoshd| 97视频在线观看免费高清完整版在线观看| 久久久久久一区二区三区| 欧美激情视频免费观看| 欧美日韩一区免费| 91欧美日韩一区| 欧美精品aaa| 一区二区三区视频在线| 性欧美视频videos6一9| 日本免费一区二区三区视频观看| 欧美日韩国产123| 国产亚洲a∨片在线观看| 欧美日韩国产第一页| 午夜精品久久久久久久白皮肤| 国模叶桐国产精品一区| 亚洲精品国产品国语在线| 日韩av片永久免费网站| 中文字幕亚洲情99在线| 成人午夜黄色影院| 国产精品扒开腿做爽爽爽视频| 欧美日韩在线一区| www.欧美三级电影.com| 日韩av综合网| 精品国产一区二区三区久久久| 中文字幕精品久久久久| 96精品视频在线| 欧美在线激情网| 国产免费亚洲高清| 国内精品久久久久久久| 亚洲片在线资源| 91美女福利视频高清| 国产91在线高潮白浆在线观看| 国产精品久在线观看| 国产精品久久久久久久久久新婚| 精品无人区太爽高潮在线播放| 成人免费高清完整版在线观看| 4438全国亚洲精品在线观看视频| 国产91ⅴ在线精品免费观看| 91色琪琪电影亚洲精品久久| 欧美黑人性生活视频| 亚洲久久久久久久久久| 色综合视频网站| 超碰日本道色综合久久综合| 精品在线观看国产| 亚洲人av在线影院| 色偷偷亚洲男人天堂| 国产欧美精品久久久| 日韩av最新在线| 午夜美女久久久久爽久久| 亚洲高清免费观看高清完整版| 欧美视频精品一区| 久久人人97超碰精品888| 国产精品第三页| 欧美激情视频一区二区| 91九色国产视频| 亚洲国产天堂久久国产91| 91免费人成网站在线观看18| 91最新在线免费观看| 欧美大码xxxx| 成人羞羞国产免费| 8x海外华人永久免费日韩内陆视频| 久久久久国产视频| 日韩电影网在线| 欧美情侣性视频| 精品亚洲aⅴ在线观看| 日本道色综合久久影院| 中文字幕精品一区久久久久| 久久人人爽人人爽人人片亚洲| 久久精品一本久久99精品| 亚洲成人亚洲激情| 992tv成人免费视频| 亚洲人成电影在线播放| 国产99在线|中文| 国产日韩换脸av一区在线观看| 欧美激情女人20p| 精品毛片网大全| 久久影院资源站| 色狠狠av一区二区三区香蕉蜜桃| 成人免费在线视频网址| 黑人巨大精品欧美一区二区免费| 97精品欧美一区二区三区| 久久久久久欧美| 欧美美最猛性xxxxxx| 国产一区二区三区视频在线观看| 久久久这里只有精品视频| 国产成人精品av在线| 国产一区二区激情| 色久欧美在线视频观看| 国产精品国产三级国产aⅴ浪潮| 欧美亚洲视频在线观看| 国产精品久久久久久久久粉嫩av| 亚洲深夜福利视频| 日本电影亚洲天堂| 久久久91精品国产| 91av视频在线观看| 在线看国产精品| 欧美老肥婆性猛交视频| 亚洲 日韩 国产第一| 久久手机精品视频| 国产午夜精品一区二区三区| 一区二区三区日韩在线| 精品视频www| 51精品国产黑色丝袜高跟鞋| 久久视频精品在线| 夜夜狂射影院欧美极品| 日韩美女主播视频| 色悠久久久久综合先锋影音下载| 亚洲精品美女网站| 色婷婷综合久久久久中文字幕1| 亚洲片在线资源|