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

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

Qt之音樂播放器一

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

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
91av在线影院| 亚洲最新中文字幕| 国产精品入口免费视频一| 亚洲综合av影视| 91精品久久久久久久久青青| 欧美福利视频在线| 久久综合国产精品台湾中文娱乐网| 欧美性猛交xxxx乱大交3| 自拍视频国产精品| 欧美片一区二区三区| 91夜夜未满十八勿入爽爽影院| 成人看片人aa| 日韩中文字幕不卡视频| 9.1国产丝袜在线观看| 法国裸体一区二区| 亚洲欧美国产精品va在线观看| 日韩中文字幕在线视频| 亚洲图片在线综合| 国产精品亚洲网站| 亚洲一区二区三| 北条麻妃99精品青青久久| 亚洲电影免费在线观看| 亚洲最新av在线网站| 国产精品久久婷婷六月丁香| 日韩欧美高清在线视频| 国产在线观看精品一区二区三区| 国产第一区电影| 日韩在线视频免费观看高清中文| 国产成人aa精品一区在线播放| 久久精品国产亚洲一区二区| 日韩av在线免费播放| 午夜精品一区二区三区在线视频| 国产精品欧美日韩一区二区| 热久久免费视频精品| 欧美国产日韩精品| 国产精品美女久久久久av超清| 国产在线拍揄自揄视频不卡99| 日韩成人网免费视频| 久久久久国色av免费观看性色| 国产成人精品电影| 国产精品入口夜色视频大尺度| 亚洲欧美综合区自拍另类| 欧美日韩亚洲网| 日韩亚洲一区二区| 久久精品国产综合| 久久亚洲欧美日韩精品专区| 亚洲qvod图片区电影| 国产一区二区日韩精品欧美精品| 中文字幕在线看视频国产欧美| 日韩精品免费综合视频在线播放| 亚洲欧美日韩精品久久亚洲区| 欧美日韩综合视频网址| 日韩欧美福利视频| 国产精品91视频| 黑人巨大精品欧美一区二区免费| 亚洲美女精品久久| 中文字幕国产精品久久| 国产成人97精品免费看片| 国产亚洲一区二区精品| 中文字幕国产精品久久| 久久久久中文字幕| 国产极品精品在线观看| xvideos成人免费中文版| 国产热re99久久6国产精品| 日韩男女性生活视频| 久久国产天堂福利天堂| 色老头一区二区三区在线观看| 亚洲乱亚洲乱妇无码| 亚洲精品www| 久青草国产97香蕉在线视频| 成人亚洲欧美一区二区三区| 伊人av综合网| 亚洲精品中文字| 欧美疯狂xxxx大交乱88av| 91久久精品国产91性色| 成人免费在线视频网址| 国内久久久精品| 热久久免费国产视频| 亚洲第一网中文字幕| 日韩精品一二三四区| 国产精品一区专区欧美日韩| 95av在线视频| 久久精品成人欧美大片| 日韩三级影视基地| 精品偷拍各种wc美女嘘嘘| 国产一区二区三区精品久久久| 久久综合国产精品台湾中文娱乐网| 久久精品视频一| 亚洲成年人影院在线| 日韩国产中文字幕| 78m国产成人精品视频| 精品久久久久久久久久久| 成人激情电影一区二区| 日韩极品精品视频免费观看| 久久激情视频免费观看| 亚洲美女自拍视频| 孩xxxx性bbbb欧美| 日韩视频在线免费观看| 日本高清+成人网在线观看| 精品国偷自产在线视频99| 91九色国产社区在线观看| 亚洲成人精品av| 精品亚洲一区二区三区在线播放| 亚洲人成在线观看网站高清| 国产精品自拍视频| 日韩av手机在线观看| 亚洲免费av电影| 国产精品99免视看9| 欧美午夜精品伦理| 国产日韩欧美夫妻视频在线观看| 色偷偷av亚洲男人的天堂| 91九色国产在线| 国产女人18毛片水18精品| 92裸体在线视频网站| 在线看福利67194| 91高清视频在线免费观看| 精品一区二区亚洲| 国产日产欧美精品| 91国偷自产一区二区三区的观看方式| 欧美极品少妇xxxxx| 欧美老女人bb| 久久99精品视频一区97| 国产精品夫妻激情| 亚洲最大成人免费视频| 日韩精品在线免费观看| 精品国产91久久久久久老师| 91精品在线一区| 亚洲国产另类 国产精品国产免费| 欧美午夜视频在线观看| 久久久久亚洲精品成人网小说| 欧美大尺度电影在线观看| 久久久久久18| 国产精品第100页| 91免费国产视频| 亚洲天天在线日亚洲洲精| 成人av电影天堂| 亚洲精品国产综合久久| 日韩av三级在线观看| 精品久久久久久亚洲精品| 3344国产精品免费看| 欧美国产极速在线| 日韩av中文字幕在线免费观看| 亚洲999一在线观看www| 亚洲国产精品va在线观看黑人| 日韩精品一二三四区| 国产精品第3页| 成人精品久久av网站| 国产亚洲视频在线观看| 国产精品网红直播| 日韩欧美国产一区二区| 97av在线视频免费播放| 欧美精品videos性欧美| 国产日韩欧美成人| 激情亚洲一区二区三区四区| 2023亚洲男人天堂| 亚洲综合日韩中文字幕v在线| 亚洲乱亚洲乱妇无码| 国产综合福利在线| 98精品国产自产在线观看| 欧美专区在线观看| 久久99精品久久久久久噜噜| 欧美天堂在线观看| 久久精品国产亚洲一区二区| 中文字幕9999|