天气预报模块

本文档详细介绍了如何利用QT界面和聚合数据的天气预报API,通过发送网络请求、解析JSON数据来展示天气信息。包括城市、日期、温度、天气状况以及对应的图标,同时解释了HTTP与HTTPS的区别。在处理JSON数据时,通过字符串分割方法获取所需信息,并更新到QT界面中。
摘要由CSDN通过智能技术生成

步骤

1. 选择 API

我用的是 聚合数据 上的 “天气预报” https://www.juhe.cn/docs/api/id/73
在这里插入图片描述
选择它的原因主要是:免费数据简洁明了

2. 发送网络请求

manager = new QNetworkAccessManager(this);
QObject::connect(manager, &QNetworkAccessManager::finished, this, &WeatherWindow::replyFinished);
 //往天气预报 API 发出请求
manager->get(QNetworkRequest(QUrl("http://apis.juhe.cn/simpleWeather/query?city=广州&key=118d24f3f0c7b522a6142d9a0a4f01c9")));

注意:发送网络请求的网络地址开头必须是 http , 不能是 https , 否则无法获取网络响应

  • http:超文本传输协议,以明文方式发送内容,不提供任何方式的数据加密
  • https:在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密
  • 具体关于 http 和 https 的介绍可参考博客 https://www.cnblogs.com/wqhwe/p/5407468.html

3. 接收网络响应获得的json并进行解析

//处理收到的 json 数据
void WeatherWindow::replyFinished(QNetworkReply *reply)
{
    QString json_msg = reply->readAll();

    qDebug() << json_msg;
    //定义一个变量用于记录位置
    int position;
    weather_tmp = json_msg.split('"');
    //设置当天的地点、天气、温度
    ui->label_loca_city->setText(weather_tmp[9].toUtf8());
    ui->label_local_temperature->setText(weather_tmp[15].toUtf8());
    //将保存在本文件中的天气图标用链接显示出来
    ui->label_local_weather->setStyleSheet(QString("border-image: url(:/pic/%1);").arg(get_weather_pic(weather_tmp[23])));

    //减小 json_msg 的长度, weather_tmp 能存储的内容有限
    position = json_msg.indexOf("date");
    json_msg = json_msg.remove(0,position);
    weather_tmp = json_msg.split('"');
    ui->label1_date->setText(weather_tmp[2].toUtf8());
    weather_tmp[6].replace(QString("\\/"),QString("—"));
    ui->label1_temperature->setText(weather_tmp[6]);
    ui->label1_weather->setStyleSheet(QString("border-image: url(:/pic/%1);").arg(get_weather_pic(weather_tmp[10])));

    position = json_msg.indexOf("date",4);
    json_msg = json_msg.remove(0,position);
    weather_tmp = json_msg.split('"');
    ui->label2_date->setText(weather_tmp[2].toUtf8());
    weather_tmp[6].replace(QString("\\/"),QString("—"));
    ui->label2_temperature->setText(weather_tmp[6]);
    ui->label2_weather->setStyleSheet(QString("border-image: url(:/pic/%1);").arg(get_weather_pic(weather_tmp[10])));

    position = json_msg.indexOf("date",4);
    json_msg = json_msg.remove(0,position);
    weather_tmp = json_msg.split('"');
    ui->label3_date->setText(weather_tmp[2].toUtf8());
    weather_tmp[6].replace(QString("\\/"),QString("—"));
    ui->label3_temperature->setText(weather_tmp[6]);
    ui->label3_weather->setStyleSheet(QString("border-image: url(:/pic/%1);").arg(get_weather_pic(weather_tmp[10])));

    position = json_msg.indexOf("date",4);
    json_msg = json_msg.remove(0,position);
    weather_tmp = json_msg.split('"');
    ui->label4_date->setText(weather_tmp[2].toUtf8());
    weather_tmp[6].replace(QString("\\/"),QString("—"));
    ui->label4_temperature->setText(weather_tmp[6]);
    ui->label4_weather->setStyleSheet(QString("border-image: url(:/pic/%1);").arg(get_weather_pic(weather_tmp[10])));

    position = json_msg.indexOf("date",4);
    json_msg = json_msg.remove(0,position);
    weather_tmp = json_msg.split('"');
    ui->label5_date->setText(weather_tmp[2].toUtf8());
    weather_tmp[6].replace(QString("\\/"),QString("—"));
    ui->label5_temperature->setText(weather_tmp[6]);
    ui->label5_weather->setStyleSheet(QString("border-image: url(:/pic/%1);").arg(get_weather_pic(weather_tmp[10])));
}

4. 天气图标的显示

//返回天气图标的路径
QString WeatherWindow::get_weather_pic(QString name)
{
    if(name == "中雨")    return QString("heavy_rain.png");
    else if(name == "雷阵雨")  return QString("rain_thunder.png");
    else if(name == "中雨转雷阵雨")   return QString("rain_thunder.png");
    else if(name == "多云")   return QString("cloudy.png");
    else if(name == "晴")    return QString("sunny.png");
    else    return QString("unknown.png");
}

QT 界面设计

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值