刷新当天天气
我们使用如下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对象
    }
}效果演示
// 根据不同城市给出不同的天气情况


  




















