刷新当天天气
我们使用如下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.5ui->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 匹配 urlurlyiKe += "&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对象}}
效果演示
// 根据不同城市给出不同的天气情况