这是我在上一年的下半年在b站上学习的,现在回过头来,总结一下。
学习自:大轮明王讲Qt
【QT开发专题-天气预报】1. 效果演示、技术分析_哔哩哔哩_bilibili
他讲得非常好,给了我很多的帮助。
1.如何获取数据,就是各种天气数据
http://t.weather.itboy.net/api/weather/city/城市编号如:101010100(北京)
http://t.weather.itboy.net/api/weather/city/101010100
浏览器中打开后:
也可以使用postman来查看内容
为了查看时更加方便,我们可以使用JSON在线解析及格式化验证 - JSON.cn
把从postman中得到的数据放到这里解析。
具体地,我们要做三件事
1.获取json文件
输入url--->json文件
使用 QNetworkAccessManager类的get方法
QUrl url("http://t.weather.itboy.net/api/weather/city/"+cityCode);
mNetworkAccessmanager.get(QNetworkRequest(url));
connect(&mNetworkAccessmanager,&QNetworkAccessManager::finished,
this,&MainWindow::onReplied
);
void MainWindow::onReplied(QNetworkReply *reply)
{
//状态码
int status_code=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
//qDebug()<<"status code:"<<status_code;
//qDebug()<<"operation:"<<reply->operation();
//qDebug()<<"url:"<<reply->url();
//qDebug()<<"raw header:"<<reply->rawHeaderList();
if(reply->error()!=QNetworkReply::NoError ||status_code!=200)
{
qDebug()<<reply->errorString().toLatin1().data();
QMessageBox::warning(this,"天气","请求数据失败",QMessageBox::Ok);
}
else{
QByteArray byteArray=reply->readAll();
//qDebug()<<"read all: "<<byteArray.data();
parseJson(byteArray);
}
reply->deleteLater();
}
2.解析json文件
void MainWindow::parseJson(QByteArray &byteArray)
{
QJsonParseError err;
QJsonDocument doc=QJsonDocument::fromJson(byteArray,&err);
if(err.error!=QJsonParseError::NoError)
{
return ;
}
QJsonObject rootobj=doc.object();
//qDebug()<<rootobj.value("message").toString();
QJsonObject cityInfo=rootobj.value("cityInfo").toObject();
QJsonObject data=rootobj.value("data").toObject();
QJsonArray array=data.value("forecast").toArray();
QJsonObject today=array.at(0).toObject();
mToday.city=cityInfo.value("city").toString();
mToday.date=rootobj.value("date").toString();
mToday.fl=today.value("fl").toString();
mToday.fx=today.value("fx").toString();
mToday.ganmao=data.value("ganmao").toString();
mToday.high=today.value("high").toString();
mToday.low=today.value("low").toString();
mToday.pm25=QString::number(data.value("pm25").toInt());
mToday.quality=data.value("quality").toString();
mToday.shidu=data.value("shidu").toString();
mToday.type=today.value("type").toString();
mToday.wendu=data.value("wendu").toString();
for(int i=0;i<6;i++)
{
if(i==0){
QJsonObject yesterday=data.value("yesterday").toObject();
mDay[0].InitByJson(yesterday);
}
else{
QJsonObject day=array.at(i-1).toObject();
mDay[i].InitByJson(day);
}
}
emit parseJson_over();
}
3.把获取的信息显示在页面上(已经存储在自己编写的存储信息的类里了)(这个没有太多可说的,看我们自己的ui水平吧)
(这是之前模仿的,现在来看,觉得有点丑了...)