前言:

QT获取天气信息一般都是通过调用天气服务器的接口来获取的,网上有很多免费的天气信息API,大致分为两种,一种是xml编码格式的天气信息,一种是Json编码格式的天气信息。Qt对于Json和xml格式文件都有自己的解析方式,而解析Json更为简单、方便,所以选择解析Json格式的天气信息API:http://t.weather.sojson.com/api/weather/city/101010100 (后面最后一个为城市ID)

一、设计目标

1、用Qt的HTTP通信,获取天气API的内容,再进行解析,实现连续五天的天气查询显示

2、实现对多个城市的天气信息进行查询,下面提供城市的ID

合肥 101220101
北京  101010100
襄阳     101200201
广州     101280101

二、实现过程

1、界面设计

如下图所示,天气窗口界面由图中①、②、③三部分。其中:

(1)第①部分包括日期框和时间框(QLabel),城市输入框(QComboBox),搜索按钮(QPushButton)。

(2)第②部分是显示今天的天气,包括天气类型显示框,天气图标框、当前温度、温度范围、风力以及空气质量。

(3)第③部分是接下来四天的天气显示地方,每一天由七个QLabel组成,分别显示周几、几月几号、天气图标、温度范围、天气、风力以及空气质量

2、工程目录解析

3、源代码分析

1、通过HTTP获取天气信息的流程(json格式)

(1)创建QNetworkAccessManager对象

(2)调用对象方法get/post发送请求(附带一个请求对象)

①  选择相应的URL

②  创建一个请求对象

③  通过get发送请求

(3)当请求完毕后有数据返回时,QNetworkAccessManager对象会发送finished信号,这样就会调用read_data函  数

(4).在槽函数中获取应答对象并且通过应答对象读取服务器返回的数据

2、解析读到的json格式数据

Json格式的数据是以“{}”包含,Qt把这整体数据叫做“JsonDocument”,相当于目录,并且提供了QJsonDocument类来将信息转换为Qt能够解析的Json数据格式,和QJsonParseError类来检测数据是不是Json格式。“{}”里面存放的是键值对,键值对格式为 key:value  key为键,value为值,value可以是对象,数组, 数,字符串。

(1)判断是否为json格式的数据,如果不是json格式,则程序自动退出

(2)json格式一层一层解析

①  如果键对应的值为数或字符串时,里面的内容叫做“QJsonObject”,可以由QJsonDocument的“object()”方法来获取

②  如果键对应的值为数组时,里面的内容叫做“QJsonArray”,再通过遍历将数组将数据取出来(我这里的json数据里面的数组都是存放的键值对,且键值对存放的内容为字符串)

③  如果键对应的值为对象时,则需要进一步的解析

3、关键代码已经向大家解释了,现在附上源代码

#include "weather.h"
#include "ui_weather.h"Weather::Weather(QWidget *parent) :QMainWindow(parent),ui(new Ui::Weather)
{ui->setupUi(this);//num达到一定值时刷新天气num = 0;this->rangewendu[0] = ui->range_wendu1;this->rangewendu[1] = ui->range_wendu2;this->rangewendu[2] = ui->range_wendu3;this->rangewendu[3] = ui->range_wendu4;this->rangewendu[4] = ui->range_wendu5;wtpye[0] = ui->typelb1;wtpye[1] = ui->typelb2;wtpye[2] = ui->typelb3;wtpye[3] = ui->typelb4;wtpye[4] = ui->typelb5;windlb[0] = ui->windlb1;windlb[1] = ui->windlb2;windlb[2] = ui->windlb3;windlb[3] = ui->windlb4;windlb[4] = ui->windlb5;aqilb[0] = ui->aqilb1;aqilb[1] = ui->aqilb2;aqilb[2] = ui->aqilb3;aqilb[3] = ui->aqilb4;aqilb[4] = ui->aqilb5;weeklb[1] =ui->weeklb2;weeklb[2] =ui->weeklb3;weeklb[3] =ui->weeklb4;weeklb[4] =ui->weeklb5;datalb[1] = ui->datalb2;datalb[2] = ui->datalb3;datalb[3] = ui->datalb4;datalb[4] = ui->datalb5;typepiclb[0] = ui->typepiclb1;typepiclb[1] = ui->typepiclb2;typepiclb[2] = ui->typepiclb3;typepiclb[3] = ui->typepiclb4;typepiclb[4] = ui->typepiclb5;//天气urlQUrl url("http://t.weather.sojson.com/api/weather/city/101200201");//创建一个请求对象QNetworkRequest request(url);manager.get(request);//关联finished信号connect(&manager,&QNetworkAccessManager::finished,this,&Weather::read_data);//获取时间以及刷新天气页面mtimer.start(1000);connect(&mtimer,&QTimer::timeout,this,&Weather::run);}Weather::~Weather()
{delete ui;
}//判断空气指数是哪个级别
void Weather::aqi_result(int aqi,int i)
{QString aqi_rank;if(aqi<=50) {aqi_rank ="优";aqilb[i]->setStyleSheet("background-color:#55ff7f");}else if(aqi<=100) {aqi_rank ="良"; aqilb[i]->setStyleSheet("background-color:#ffff00");}else if(aqi<=150) {aqi_rank ="轻度污染";aqilb[i]->setStyleSheet("background-color:#ffaa00");}else if(aqi<=200) {aqi_rank ="中度污染";aqilb[i]->setStyleSheet("background-color:#ff5500");}else if(aqi<=300) {aqi_rank ="重污染";aqilb[i]->setStyleSheet("background-color:#b83d00"); }else {aqi_rank ="严重污染";aqilb[i]->setStyleSheet("background-color:#686868"); }qDebug()<<aqi_rank;aqilb[i]->setText(QString::number(aqi)+" "+aqi_rank);
}//判断天气
void Weather::type_result(QString type,int i)
{QString path;if(type == "晴"){path = ":/images/images/晴.png";}else if(type=="多云" || type == "晴转多云"){path = ":/image/images/多云.png";}else if(type=="阴"){path = ":/image/images/阴.png";}else if(type=="阵雨"){path = ":/image/images/阵雨.png";}else if(type=="雷阵雨"){path = ":/image/images/雷阵雨.png";}else if(type=="小雨"){path = ":/image/images/小雨.png";}else if(type=="中雨"){path = ":/image/images/中雨.png";}else if(type=="大雨"){path = ":/image/images/大雨.png";}else if(type=="暴雨"){path = ":/image/images/暴雨.png";}else if(type =="大暴雨"||type =="大到暴雨"){path = ":/image/images/特大暴雨.png";}else {path = ":/image/images/扬沙.png";}typepiclb[i]->setPixmap(QPixmap(path));
}void Weather::background_main(QString weatherpic)
{if(weatherpic=="晴"||weatherpic == "多云" ||weatherpic == "晴转多云"||weatherpic=="阴"){this->setStyleSheet("QMainWindow{border-image:url(:/image/images/UI.png)}");}else  this->setStyleSheet("QMainWindow{border-image:url(:/image/images/UI5.png)}");
}void Weather::read_data(QNetworkReply *reply)
{QByteArray array = reply->readAll();QJsonParseError error;QJsonDocument doc = QJsonDocument::fromJson(array,&error);if(error.error !=QJsonParseError::NoError){qDebug("josn error");return ;}QJsonObject obj = doc.object();//时间QString time = obj.value("time").toString();time = time.mid(5,5);qDebug()<<time;//地区QJsonObject cityobj = obj.value("cityInfo").toObject();QString city = cityobj.value("city").toString();qDebug()<<city;QJsonObject dataobj = obj.value("data").toObject();//实时温度QString wendu = dataobj.value("wendu").toString();qDebug()<<wendu;ui->wendu->setText(wendu);//近一周的天气QJsonArray forecast_array = dataobj.value("forecast").toArray();for(int i =0;i<5;i++){QJsonObject weatherobj = forecast_array.at(i).toObject();//最高温度QString high = weatherobj.value("high").toString();high = high.mid(3);qDebug()<<high;//最低温度QString low = weatherobj.value("low").toString();low = low.mid(3,2);qDebug()<<low;//温度范围QString range_wendu = low+"~"+high;qDebug()<<range_wendu;rangewendu[i]->setText(range_wendu);//日期QString ymd = weatherobj.value("ymd").toString();ymd = ymd.mid(5);qDebug()<<ymd;//星期几week[i] =weatherobj.value("week").toString();qDebug()<<week[i];if(i!=0){weeklb[i]->setText(week[i]);datalb[i]->setText(ymd);}//天气QString type = weatherobj.value("type").toString();qDebug()<<type;if(i == 0) weatherpic = type;wtpye[i]->setText(type);type_result(type,i);//风QString fx = weatherobj.value("fx").toString();QString fl = weatherobj.value("fl").toString();QString wind = fx+fl;qDebug()<<wind;windlb[i]->setText(wind);//空气质量int aqi = weatherobj.value("aqi").toInt();qDebug()<<aqi;aqi_result(aqi,i);}//地区+日期+星期ui->datalb->setText(city+"  "+time+" "+week[0]);//设置QMainWindow的背景background_main(weatherpic);//实时天气ui->currweatherlb->setText(weatherpic+"实时");}void Weather::on_pushButton_clicked()
{QString ip;//通过获取城市输入框的当前值来选择哪个城市的URLQString city = ui->comboBox->currentText();if(city =="北京"){ip = "http://t.weather.sojson.com/api/weather/city/101010100";}else if(city=="广州"){ip = "http://t.weather.sojson.com/api/weather/city/101280101";}else if(city=="合肥"){ip = "http://t.weather.sojson.com/api/weather/city/101220101";}else if(city=="襄阳"){ip = "http://t.weather.sojson.com/api/weather/city/101200201";}//天气urlQUrl url(ip);//创建一个请求对象QNetworkRequest request(url);manager.get(request);}void Weather::run()
{QString time =  QTime::currentTime().toString("hh:mm:ss");ui->timelb->setText(time);num++;//隔五分钟刷新一次if(num>=60*5){on_pushButton_clicked();num = 0;}}

头文件

#ifndef WEATHER_H
#define WEATHER_H#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonParseError>
#include <QJsonObject>
#include <QLabel>
#include <QTimer>
#include <QTime>
namespace Ui {
class Weather;
}class Weather : public QMainWindow
{Q_OBJECTpublic:explicit Weather(QWidget *parent = nullptr);~Weather();void aqi_result(int aqi,int i);void type_result(QString type, int i);void background_main(QString weatherpic);
protected slots:void run();
private slots:void read_data(QNetworkReply *reply);void on_pushButton_clicked();private:Ui::Weather *ui;QNetworkAccessManager manager;QString weatherpic;QString week[5];QLabel *rangewendu[5];QLabel *wtpye[5];QLabel *windlb[5];QLabel *aqilb[5];QLabel *weeklb[5];QLabel *datalb[5];QLabel *typepiclb[5];QTimer mtimer;int num;
};#endif // WEATHER_H

4、项目效果图

问题咨询及项目源码请加群:

QQ群

名称:IT项目交流群

群号:245022761

基于QT的天气查询系统设计相关推荐

  1. 嵌入式项目实战——基于QT的视频监控系统设计(二)

    嵌入式项目实战--基于QT的视频监控系统设计(二) 昨天我分享了关于QT的基本使用方法,掌握了这些基本的方法就可以设计一个简单的视频监控界面.下面我们开始分享完成这个嵌入式项目同样重要的知识点--UD ...

  2. 嵌入式项目实战——基于QT的视频监控系统设计(三)

    嵌入式项目实战--基于QT的视频监控系统设计(三) 进入到五一假期第三天,继续我们的项目.本来五一假期还是想好好休息一下的,因为最近学习的状态不太好,刷题都没有思路了,但是身边的同学太卷了,不过我还是 ...

  3. 基于javaweb最短路径公交查询系统设计与实现(论文下载)

    [摘 要]随着互联网的技术的不断更新发展,人们生活节奏也在不断的加快,对于网络的依赖也越来越紧密,尤其是在等公交,经常会错过班次,但又不知道,下次班次几点发车,这样会导致乘客花掉大把时间在等待,如果可 ...

  4. 树莓派练手小项目---基于树莓派构建天气查询系统,实现内容的网页自动化检索功能

    目录 一.写在前面 二.基于树莓派构建天气查询系统 三.基于树莓派实现网页内容的自动化检索 四.有关于树莓派的其他小提醒,小技巧 Author:qyan.li Date:2022.6.19 Topic ...

  5. 嵌入式项目实战——基于QT的视频监控系统设计(四)

    嵌入式项目实战--基于QT的视频监控系统设计(四) 进入到五一假期的第四天,通过前三天的分享,相信你应该已经掌握了QT的基本使用.UDP网络编程.v4l2视频处理模块.多线程编程等基本的知识点.其实昨 ...

  6. 嵌入式项目实战——基于QT的视频监控系统设计(一)

    嵌入式项目实战--基于QT的视频监控系统设计(一) 这个五一因为疫情,只能待在家里,想了想不如将我之前做的一个小的嵌入式的练习项目分享出来,供入门嵌入式的同学们学习.基于QT的视频监控系统设计虽然是个 ...

  7. Qt 天气预报 天气查询 (代码附上)

    参考链接:https://blog.csdn.net/fangye945a/article/details/84933234 QT获取天气信息一般都是通过调用天气服务器的接口来获取的,而获取天气的接口 ...

  8. 基于PHP学生成绩查询系统设计与实现 开题报告

      本科生毕业论文 基于PHP学生成绩查询系统 开题报告 学    院: 专    业: 计算机科学与技术 年    级: 学生姓名: 指导教师:   XXXX大学本科生毕业论文(设计)开题报告书 姓 ...

  9. 基于QT的考试管理系统设计与实现

    目录 一.项目概要 4 1.1项目名称 4 1.2项目目标 4 1.3软件概要 4 1.4功能描述 5 1.5开发环境 5 1.6关键技术 6 1.7开发体制 6 1.8开发阶段 6 二.软件详细需求 ...

  10. 项目:基于QT的智能家居系统设计

    项目内容涉及QT.数据库.服务器.网关.协调器.传感器等! 邮箱:Zhangyc_Engineer@qq.com(需要的朋友联系我邮箱即可)

最新文章

  1. SAP MM T-code MD04的使用,是有前提的!
  2. 使用AD5933分析复阻抗的时钟频率设置
  3. python下载文件到本地-python从下载链接下载文件到本地
  4. 操作系统(三十七)基本分页存储的概念
  5. Android TextView 属性设置
  6. java 获取打印机缺纸_JAVASE 语言概述和JAVA
  7. 对应oracle生成java对象,Java学习笔记(十三)——通过Netbeans开发环境生成oracle数据库中表的对应hibernate映射文件...
  8. 增强火山图,要不要试一下?
  9. java 高并发im_java高并发(四)并发编程与线程安全
  10. Notification通知
  11. 行哥介绍29个国内外接私活渠道,总有一款适合你
  12. Spark生态之Alluxio学习15--alluxio性能分析和加速方式
  13. 【单片机】RGB和RGBW LED灯珠的区别
  14. 什么软件可以把图片镜像翻转_ios怎么把照片镜面翻转
  15. 计算机一级常用英语缩写,电脑常用英文单词和缩写
  16. python熊猫图案_熊猫Python数据分析库和SQL教会了我如何取平均数
  17. python两个csv表数据合并_python – 根据列中的数据合并两个CSV文件
  18. 关于vendor-id和product-id的查找
  19. 漫步数学分析二十三——级数的积分与微分
  20. 《世界上最远的距离》(泰戈尔)

热门文章

  1. CentOS6.x安装方法超详细教程
  2. mysql例子 restful_restful例子问题
  3. 网上出售企业支付宝骗局,不看后悔
  4. The Minimum Spanning Tree Problem
  5. JAVA 实现《飞机大战-III》游戏
  6. codelite14中文语言包_codelite中文版-codelite下载(开源的C++跨平台开发环境) 13.0.7 中文版 - 河东下载站...
  7. Androidx跟Android的区别
  8. 利率上浮100bp是什么意思,利率浮动值60BP什么意思
  9. iOS学习之路-简单汤姆猫
  10. No suitable resolver