Qt项目天气预报(5) - 根据JSON刷新天气信息+城市匹配
刷新当天天气
我们使用如下api接入,当然需要自己去 易客云天气API免费天气API接口|天气预报接口|全球天气API接口|气象预警|空气质量 (tianqiapi.com)注册后生成自己的对应id才可以使用
//专业天气v61
http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=65521391&appsecret=Dv2eKMLL
======================================================================
参考解析的json文件
解析获取到的json数据 - parseWeatherJsonData
void Widget::parseWeatherJsonData(QByteArray rawData)
{
QJsonDocument jsonObj = QJsonDocument::fromJson(rawData); // 先把原始数据转为JSON类型
if(!jsonObj.isNull() && jsonObj.isObject()){ // jsonObj不为空,并且是Obeject类型
QJsonObject objRoot = jsonObj.object();
//解析我们获得的json数据, 填入到相关 控件中
//解析日期
QString date = objRoot["date"].toString();
QString week = objRoot["week"].toString();
ui->labelCurrentData->setText(date + " " + week); // 把读取到的日期和星期加入到右上角的控件 labelCurrentData 中
//解析城市名称
QString cityName =objRoot["city"].toString();
ui->labelCity->setText(cityName+"市");
//解析当前温度
QString curTem = objRoot["tem"].toString();
ui->labelTemp->setText(curTem+"℃"); // 显示当前温度
QString lowTem = objRoot["tem2"].toString();
QString highTem = objRoot["tem1"].toString();
ui->labelTempRange->setText(lowTem + "~" +highTem +"℃"); // 显示温度范围
//解析天气类型
ui->labelWeatherType->setText(objRoot["wea"].toString());
//解析感冒指数
ui->labelGanMao->setText(objRoot["air_tips"].toString());
//解析风向
ui->labelFengXiang->setText(objRoot["win"].toString()); //风向
ui->labelFengXiangData->setText(objRoot["win_speed"].toString());//风力
//解析PM2.5
ui->labelPM25Data ->setText(objRoot["air_pm25"].toString());
//湿度
ui->labelShiDuData->setText(objRoot["humidity"].toString());
//空气质量
ui->labelAriData->setText(objRoot["air_level"].toString());
}
}
在readHttpReply() 里面添加
效果演示
支持不同城市的天气预报
绑定信号与槽;
在构造函数中绑定信号与槽
//由QNetworkAccessManager 发起request请求:
//实例化network对象
manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished,[](){
qDebug()<<"manager Finnish!";
});urlyiKe ="http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=65521391&appsecret=Dv2eKMLL";
QUrl urlTianQi(urlyiKe);
//QNetworkRequest - 指定请求的url地址
QNetworkRequest res(urlTianQi); //根据网址实例化QUrl对象,再根据这个对象实例化 QNetworkRequest对象
reply = manager->get(res);
//QNetworkReply网络请求后进行信号读取
connect(manager,&QNetworkAccessManager::finished,this,&Widget::readHttpReply);
每个城市id的json文件在资源里
检索json文件,寻找我们需要城市id - getCityCodeFromName
// 打开我们配置的json文件,找到对应城市id
QString getCityCodeFromName(QString name)
{
QFile file(":/citycode.json");
file.open(QIODevice::ReadOnly);
QByteArray rawData = file.readAll();
file.close();
QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
if(jsonDoc.isArray()){
QJsonArray citys = jsonDoc.array();
for(QJsonValue value:citys){
if(value.isObject()){
QString cityName = value["city_name"].toString();
if(cityName == name){
return value["city_code"].toString(); //能找到返回名字
}
}
}
return ""; //找不到,返回空
}
}
on_pushButton_clicked(搜索槽函数)
//根据用户输入城市名字获取数据
void Widget::on_pushButton_clicked()
{
QString cityNameFromUser = ui->lineEditCity->text();
QString cityCode = getCityCodeFromName(cityNameFromUser);
if(cityCode != ""){ // 能匹配到根据城市id 匹配 url
urlyiKe += "&cityid=" +cityCode;
qDebug()<<urlyiKe;
manager->get(QNetworkRequest(QUrl(urlyiKe)));
}
else{ // 没找到
QMessageBox msg;
msg.setWindowTitle("错误");
msg.setText("请输入正确的城市名称!");
msg.setStyleSheet("QPushButton{color:red};");//设置按钮样式
msg.setStandardButtons(QMessageBox::Ok); //添加Ok按钮
msg.exec();// 调用QMessageBox对象
}
}
效果演示
// 根据不同城市给出不同的天气情况
更多推荐
所有评论(0)