一、引言
- Qt获取天气信息一般都是通过调用天气服务器的接口来获取的,而接口可以自行网上查找。
- 本文获取天气信息的接口采用: http://wthrcdn.etouch.cn/weather_mini,请求参数名为city(获取某个城市的天气信息)。请求方式为get请求。
二、实现效果
下拉框选择城市获取天气信息
三、实现步骤
1、添加网络类
Qt的pro文件中添加使用天气接口的网络类,通过http请求数据。
QT += network
2、添加相关头文件
//添加网络相关头文件
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
//添加JSON解析相关的头文件,因为从该服务器请求的天气数据是以json的形式回复的
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
3、创建网络请求对象,连接信号与槽
定义相关变量后,在构造函数中连接信号与槽
manager = new QNetworkAccessManager(this); //新建QNetworkAccessManager对象
//当收到http请求回复的数据,便会调用replyDone槽函数。
//关联信号和槽
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyDone(QNetworkReply*)));
4、请求并获取天气相关数据
void myLockWindow::btn_getdata_clicked(const QString &)
{
//获得需要查询天气的城市名称
QString local_city = QString(city_combx->currentText()); .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);
}
5、处理回复数据——槽函数
void myLockWindow::replyDone(QNetworkReply *reply)
{
QString all = reply->readAll();
// ui->textEdit->setText(all); //将接收到的数据显示出来
qDebug()<<"recv weather data!!"<<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();
// QString ganmao = today_weather.value("ganmao").toString();//感冒提示
temperature= 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);
wind_power= today_weather.value("fengxiang").toString() + strength;
this->lab_type->setText(weather_type); //显示天气类型
this->lab_temperature->setText(temperature); //显示温度
this->lab_wind_power->setText(wind_power); //显示风力
// this->lab_ganmao->setText(ganmao);
}
}
}
}
}
else
{
qDebug()<<"请求数据失败";
}
reply->deleteLater(); //销毁请求对象
}