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

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

Qt之音樂播放器一

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

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
国产国语videosex另类| 精品福利在线视频| 国产精品亚洲综合天堂夜夜| 色噜噜亚洲精品中文字幕| 亚洲精品视频播放| 成人写真视频福利网| 久久久久久久一区二区三区| 亚洲人午夜精品免费| 日韩精品免费视频| 国产综合福利在线| 国产精品在线看| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲欧洲日产国产网站| 亚洲福利精品在线| 97福利一区二区| 亚洲情综合五月天| 久久精品人人爽| 亚洲人成绝费网站色www| 欧美日韩国产一区在线| 欧美在线视频观看免费网站| 亚洲天堂视频在线观看| 成人xxxx视频| 97人洗澡人人免费公开视频碰碰碰| 国语自产精品视频在免费| 欧美视频在线看| 热久久免费视频精品| 欧美亚洲国产成人精品| 尤物九九久久国产精品的分类| 久久综合久中文字幕青草| 揄拍成人国产精品视频| 国产精品久久久久一区二区| 久久亚洲春色中文字幕| 亚洲国产成人在线视频| 欧美精品在线视频观看| 欧美大学生性色视频| 久久不射电影网| 亚洲人av在线影院| 久久影视电视剧免费网站清宫辞电视| 国产91精品久久久| 九九精品视频在线| 自拍偷拍亚洲欧美| 日韩电影中文字幕在线| 在线精品播放av| 久久99热精品| 国产专区欧美专区| 国产精品免费电影| 国产丝袜一区二区三区免费视频| 亚洲一区二区三区视频| 欧美大片第1页| 亚洲第五色综合网| 国产精品福利在线观看| 色琪琪综合男人的天堂aⅴ视频| 成人黄色片网站| 日韩精品欧美国产精品忘忧草| 久久久久久97| 菠萝蜜影院一区二区免费| 亚洲精品一区二三区不卡| 不卡中文字幕av| 欧美国产高跟鞋裸体秀xxxhd| 欧美激情精品久久久久久| 亚洲精品国产精品乱码不99按摩| 91免费高清视频| 精品国产乱码久久久久酒店| 亚洲国产97在线精品一区| 亚洲精品456在线播放狼人| 色樱桃影院亚洲精品影院| 欧美性生活大片免费观看网址| 国产在线播放不卡| 精品激情国产视频| 中文字幕欧美日韩精品| 亚洲欧美日韩中文视频| 日韩欧美国产成人| 不卡av在线播放| 日本精品va在线观看| 久久久久久尹人网香蕉| 97人人模人人爽人人喊中文字| 精品国产乱码久久久久酒店| 色婷婷综合成人| 欧美激情网站在线观看| 国产午夜精品理论片a级探花| www.日韩视频| 中文字幕精品www乱入免费视频| 亚洲色在线视频| 日本成人在线视频网址| 久久精品99久久香蕉国产色戒| zzijzzij亚洲日本成熟少妇| 欧美成人午夜免费视在线看片| 在线成人激情视频| 日韩女优在线播放| 中文字幕亚洲欧美一区二区三区| 91精品国产91久久久久福利| 日韩中文字幕不卡视频| 国产精品第一页在线| 在线精品高清中文字幕| 欧美成人亚洲成人日韩成人| 91免费精品国偷自产在线| 欧美精品videos另类日本| 欧美夫妻性视频| 久久精品国产v日韩v亚洲| 日本免费一区二区三区视频观看| 中文字幕日韩av综合精品| 亚洲成人av在线| 国产精品无av码在线观看| 日本一区二区不卡| 亚洲图中文字幕| 伊人久久大香线蕉av一区二区| 欧美猛少妇色xxxxx| 色综久久综合桃花网| 欧美二区在线播放| 精品国产精品三级精品av网址| 亚洲国产成人久久综合| 日韩av最新在线| 久久综合电影一区| 欧美最顶级丰满的aⅴ艳星| 欧美丝袜一区二区| 伦伦影院午夜日韩欧美限制| 91黄色8090| 国产精品扒开腿做爽爽爽视频| 日韩精品在线观看一区二区| 久久精品亚洲精品| 久久久久国色av免费观看性色| 日韩成人av在线播放| 欧美日韩亚洲高清| 91高清视频免费观看| 久久色在线播放| 亚洲精品成人久久电影| 日韩视频免费在线观看| 久热精品视频在线| 午夜剧场成人观在线视频免费观看| 欧美激情精品久久久久久大尺度| 国产亚洲精品高潮| 日韩电影免费观看中文字幕| 高清欧美性猛交| 欧美高清第一页| 久久97久久97精品免视看| 亚洲天堂日韩电影| 欧美日韩xxxxx| 好吊成人免视频| 日韩欧美在线视频日韩欧美在线视频| 日韩成人在线电影网| 久久亚洲精品一区二区| 色中色综合影院手机版在线观看| 欧美最猛性xxxx| 国产精品日韩电影| 国产精品色悠悠| 欧美日韩综合视频网址| 亚洲人成电影网站色| 亚洲精品中文字幕有码专区| 欧美一区二区三区免费视| 91亚洲va在线va天堂va国| 精品一区精品二区| 亚洲欧美激情四射在线日| 亚洲成**性毛茸茸| 亚洲午夜性刺激影院| 茄子视频成人在线| 国产精品美女在线| 国产区精品视频| 色哟哟网站入口亚洲精品| 日韩欧美中文字幕在线播放| 91精品国产自产在线观看永久| 日韩欧美一区视频| 欧美福利视频网站| 久久久91精品| 狠狠色狠色综合曰曰|