读取豆瓣图书API并下载封面图片的Qt程序

豆瓣图书API有XML和JSON两种,以CSAPP 3rd的API为例分别如下:
XML:http://api.douban.com/book/subject/isbn/9780134092669
JSON:https://api.douban.com/v2/book/isbn/:9780134092669
程序中使用的是JSON格式。

首先要解析已保存好的.json文件,有以下步骤:
1.用QFile类读取.json文件,涉及函数QFile::open()和QFile::readAll(),读取完毕后用QFile::close()关闭文件。
2.将用QFile::readAll()读取到的数据转换为QJsonDocument类,涉及函数QJsonDocument::fromJson()。
3.将QJsonDocument类转换为QJsonObject类,涉及函数QJsonDocument::object()。
4.对QJsonObject类进行操作,例如读取图书title:
QString title = jsonObject["title"].toString();

API中的image项给出了封面图片的地址。下载图片要用到网络连接的三个类:QNetworkAccessManager、QNetworkReply和QNetworkRequest。步骤如下:
1.设置url,涉及函数QNetworkRequest::setUrl()。
2.QNetworkAccessManager::get()。
3.用信号槽QObject::connect()完成图片下载。网络连接的操作似乎必须要用信号槽实现。

main()函数:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QFile file(":/file/book.json");
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QString value = file.readAll();
    file.close();

    QJsonParseError parseJsonErr;
    QJsonDocument jsonDocument = QJsonDocument::fromJson(value.toUtf8(), &parseJsonErr);
    if(!(parseJsonErr.error == QJsonParseError::NoError)){
        qDebug() << QString("Wrong");
    }
    QJsonObject jsonObject = jsonDocument.object();
    QString title = jsonObject["title"].toString();
    QUrl url(jsonObject["image"].toString()); //construct

    QNetworkAccessManager manager;
    QNetworkRequest request;
    request.setUrl(url);
    QNetworkReply *reply = manager.get(request);
    QObject::connect(&manager,&QNetworkAccessManager::finished,[=]{
        QPixmap pixmap;
        pixmap.loadFromData(reply->readAll());
        pixmap.save(title,"JPG");});

    return a.exec();
}

待改进&问题:
1.API中的images项底下还有small、large和medium三个小项,怎么读取小项中的值?
2.网络连接信号槽函数的写法。

你可能感兴趣的:(Qt,Project)