QT小项目-QT在线音乐播放器

QT在线音乐播放器

    • 先上几张音乐播放器的图片
    • 具体实现及部分代码
    • 后面还有好多就不一一例举了

先上几张音乐播放器的图片

(主页图片来源网络)
QT小项目-QT在线音乐播放器_第1张图片
QT小项目-QT在线音乐播放器_第2张图片
QT小项目-QT在线音乐播放器_第3张图片
QT小项目-QT在线音乐播放器_第4张图片
QT小项目-QT在线音乐播放器_第5张图片

具体实现及部分代码

搜索歌曲和获取歌曲具体信息的URL,这里说明一点,酷狗音乐现在的反爬虫机制,我们在发送HTTP请求时,需要携带COOKIE才能请求成功,否则会返回 {“status”:0,“err_code”:20010,“data”:[]}的错误请求, 所以这里的COOKIE需要替换成自己浏览器里边的COOKIE

#define COOKIE "填写自己浏览器的COOKIE"
#define PLAYURL "https://wwwapi.kugou.com/yy/index.php?r=play/getdata&hash=%1&album_id=%2"
//如果你的QT没有添加ssl你可以把https改为http,或者百度QT怎么post请求https
#define SEARCHURL "http://songsearch.kugou.com/song_search_v2?keyword=%1&page=%2&pagesize=10"

请求歌曲的FileHash及AlbumID函数,此函数与QPushButton类的点击信号关联

// 请求歌曲filehash及AlbumID
void Widget::on_search_btn_clicked()
{
    ui->detail_widget->setCurrentIndex(2);
    page = 1;
    request->setUrl(QString(search_url).arg(ui->search_edit->text()).arg(page));
//    qDebug() << QString(search_url).arg(ui->search_edit->text());
    manager->get(*request);
}
 

请求歌曲filehash及AlbumID的处理函数,此函数与QNetworkAccessManager类的finished信号关联

//当我们把歌曲filehash及id请求回来的同时,我们发起第二次请求--歌曲具体信息请求,此请求会返回歌曲的具体信息(timelength,filesize,img,author_name,song_name等)
void Widget::httpReply(QNetworkReply *reply)
{

    QByteArray byte_arr = reply->readAll();
    if (!byte_arr.isEmpty())
    {
        QJsonDocument document = QJsonDocument::fromJson(byte_arr);
        QJsonObject json_obj = document.object();

        QJsonObject json_obj_data = json_obj.value("data").toObject();


        if (!json_obj_data.isEmpty())
        {
            page_size = json_obj_data.value("pagesize").toInt();
            qDebug() << "pagesize" << page_size;
            QJsonArray music_list_json = json_obj_data.value("lists").toArray();
            if (!music_list_json.isEmpty())
            {
                for (int i = 0; i < 10; i++)
                {
                    if (music_info[i] == NULL)
                    {
                        break;
                    }

                    QJsonObject music_name_obj = music_list_json[i].toObject();
                    music_info[i]->hash = music_name_obj.value("FileHash").toString();
                    music_info[i]->album_id = music_name_obj.value("AlbumID").toString();

                    request_music->setUrl(QString(play_url).arg(music_info[i]->hash).arg(music_info[i]->album_id));

                    request_music->setRawHeader("Cookie", COOKIE);
                    request_music->setRawHeader("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
                    manager_music->get(*request_music);
                    qDebug() << QString(play_url).arg(music_info[i]->hash).arg(music_info[i]->album_id);
                }
            }
        }
    }

}

请求歌曲具体信息处理函数

//这里根据自己的需求选择需要保存的内容,这一步会返回歌词,但我选择不保存歌词,因为太浪费内存,后面需要显示歌词的时候再单独请求
void Widget::httpReplyMusicInfo(QNetworkReply *reply)
{
    QByteArray byte_arr = reply->readAll();

    if (!byte_arr.isEmpty())
    {
        QJsonDocument document = QJsonDocument::fromJson(byte_arr);
        QJsonObject json_obj = document.object();

        QJsonObject json_obj_data = json_obj.value("data").toObject();
        if (!json_obj_data.isEmpty())
        {
            int i = 0;
            QString hash = json_obj_data.value("hash").toString();
            QString id = json_obj_data.value("album_id").toString();
            for (i = 0; i < 10; i++)
            {
                if (hash == music_info[i]->hash && id ==music_info[i]->album_id)
                    break;
            }

            if (i == 10)
            {
                for(int i = 0; i < 10; i++)
                {
                    if (music_item[i] != NULL)
                    {
                        delete music_item[i];
                        music_item[i] = NULL;
                    }
                }

                qDebug() << "没有获取到音乐";
                return ;
            }

            music_info[i]->time_length = json_obj_data.value("timelength").toInt();
            music_info[i]->file_size = json_obj_data.value("filesize").toInt();
            music_info[i]->img_url = json_obj_data.value("img").toString();
            music_info[i]->have_mv = json_obj_data.value("have_mv").toInt();
            music_info[i]->author_name = json_obj_data.value("author_name").toString();
            music_info[i]->song_name = json_obj_data.value("song_name").toString();
            music_info[i]->play_url = json_obj_data.value("play_url").toString();
            music_info[i]->album_name = json_obj_data.value("album_name").toString();

            if (music_item[i] == NULL)
            {
                music_item[i] = new MyItem(ui->listWidget);
                QSize size =  music_item[i]->music_item->sizeHint();
                music_item[i]->music_item->setSizeHint(QSize(size.width(), 56));
                ui->listWidget->addItem(music_item[i]->music_item);
                music_item[i]->music_widget->setSizeIncrement(QSize(size.width(), 56));
                connect(music_item[i]->paly_btn, SIGNAL(clicked(bool)), this, SLOT(palyBtn()));
                connect(music_item[i]->add_btn, SIGNAL(clicked(bool)), this, SLOT(addBtn()));
            }

            QString null_str;
            null_str.clear();
            for(int j = 0; j <= i; j++)
                null_str += " ";
            music_item[i]->paly_btn->setText(null_str);
            music_item[i]->add_btn->setText(null_str);

            emit requestFinshed(i);

        }
    }
}

请求网络图片处理函数

//将我们歌曲对应的图片显示到主页下方播放栏和歌词页面
void Widget::httpReplyImg(QNetworkReply *reply)
{
    if (reply->error() == QNetworkReply::NoError)
    {
        QByteArray bytes = reply->readAll();

        pm = new QPixmap;
        pm->loadFromData(bytes);

        QRect rc = ui->label->rect();

        QPixmap pm1 = pm->scaled(rc.size(), Qt::KeepAspectRatio);

        QRect rc1 = music_img->rect();

        QPixmap pm2 = pm->scaled(rc1.size(), Qt::KeepAspectRatio);

//        ui->label->setAutoFillBackground(true);
        ui->label->setPixmap(pm1);

        music_img->setPixmap(pm2);

    }
    else
    {
        //出错
    }
}

后面还有好多就不一一例举了

对于歌词显示用的是QT的正则匹配,有需要的可以下载参考https://download.csdn.net/download/LinkerJon/11971061

你可能感兴趣的:(QT应用#在线音乐播放器)