1. 程式人生 > >基於QT5 HTTP GET方式獲取天氣資訊

基於QT5 HTTP GET方式獲取天氣資訊

QT版本:Qt Creator 5.7.0

QT獲取天氣資訊一般都是通過呼叫天氣伺服器的介面來獲取的,而獲取天氣的介面有很多,大家可以自行在網上查詢。

本示例採用的獲取天氣的伺服器介面為:  http://wthrcdn.etouch.cn/weather_mini,請求引數名city引數內容為要查詢天氣的城市名稱(utf8字串)。請求方式為GET

使用QT呼叫天氣介面則需要用到網路類,通過HTTP請求資料。

首先在pro檔案中新增:

QT       += network

然後新增網路相關標頭檔案:

#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>

由於從該伺服器請求的天氣資料是以json的形式回覆的,所以需要用到JSON解析相關的標頭檔案。

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

相關變數定義如下:

QNetworkAccessManager *manager;  //請求控制代碼
QString fengli;       //風力
QString wendu;        //溫度
QString weather_type;  //天氣型別

建立網路請求物件,連線訊號與槽:

manager = new QNetworkAccessManager(this);  //新建QNetworkAccessManager物件
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));//關聯訊號和槽

當收到http請求回覆的資料,便會呼叫replyFinished槽函式。

請求氣資料:

void Widget::on_pushButton_clicked() //點選查詢請求天氣資料
{
    QString local_city = ui->lineEdit->text().trimmed(); //獲得需要查詢天氣的城市名稱
    char quest_array[256]="http://wthrcdn.etouch.cn/weather_mini?city=";
    QNetworkRequest quest;
    sprintf(quest_array,"%s%s",quest_array,local_city.toUtf8().data());
    quest.setUrl(QUrl(quest_array));
    quest.setHeader(QNetworkRequest::UserAgentHeader,"RT-Thread ART");    
    /*傳送get網路請求*/
    manager->get(quest);
}

回覆資料處理槽函式:

void Widget::replyFinished(QNetworkReply *reply)  //天氣資料處理槽函式
{
    qDebug()<<"recv weather data!!";
    QString all = reply->readAll();
    ui->textEdit->setText(all); //將接收到的資料顯示出來

    QJsonParseError err;
    QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(),&err);//解析json物件
    qDebug() << err.error;
    if(!json_recv.isNull())
    {
        QJsonObject object = json_recv.object();

        if(object.contains("data"))
        {
            QJsonValue value = object.value("data");  // 獲取指定 key 對應的 value
            if(value.isObject())
            {
                QJsonObject object_data = value.toObject();
                if(object_data.contains("forecast"))
                {
                    QJsonValue value = object_data.value("forecast");
                    if(value.isArray())
                    {
                        QJsonObject today_weather = value.toArray().at(0).toObject();
                        weather_type = today_weather.value("type").toString();

                        QString low = today_weather.value("low").toString();
                        QString high = today_weather.value("high").toString();
                        wendu = low.mid(low.length()-3,4) +"~"+ high.mid(high.length()-3,4);
                        QString strength = today_weather.value("fengli").toString();
                        strength.remove(0,8);
                        strength.remove(strength.length()-2,2);
                        fengli = today_weather.value("fengxiang").toString() + strength;
                        ui->type->setText(weather_type); //顯示天氣型別
                        ui->wendu->setText(wendu);   //顯示溫度
                        ui->fengli->setText(fengli); //顯示風力
                    }
                }
            }
        }

    }else
    {
        qDebug()<<"json_recv is NULL or is not a object !!";
    }
    reply->deleteLater(); //銷燬請求物件
}

 天氣請求回覆的JSON資料中含有多天的詳細天氣資訊,但在此只解析了當天的天氣狀態、溫度和風力三個引數資訊,以供參考,Demo程式演示效果如下。

獲取天氣demo原始碼連結:https://download.csdn.net/download/fangye945a/10839157