基於QT5 HTTP GET方式獲取天氣資訊
阿新 • • 發佈:2018-12-23
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