目录

设计目标

效果展示

实现过程

http通信

Json格式数据解析

UI设计

源码


设计目标

1、用Qt网络编程实现天气查询显示

2、使用免费天气API :http://t.weather.sojson.com/api/weather/city/城市id

北京 101010100
武汉 101200101
襄阳 101200201
广州 101280101

3、自己搭建apache服务器

效果展示

实现过程

http通信

1. http客户端

(1) 创建套接字--与服务器建立连接

(2)向服务器发送http请求数据(http头, 请求数据)

http头:GET / HTTP/1.1\r\nHost: 192.168.12.2:9090/index.html   \r\nConnection: Keep-Alive\r\n

(3) 如果请求是合法,服务器会返回请求的数据

2、Qt中http通信

#include <QNetworkAccessManager>

--管理整个http通信负责发送请求,后期的应答

--请求方式get, post, put

#include <QNetworkRequest> --请求对象---请数据要放在这个对象中
#include <QNetworkReply> --当服务器回应的数据通过应答对象获取

通信流程

(1)创建QNetworkAccessManager对象

QNetworkAccessManager manager;

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

QUrl url("http://t.weather.sojson.com/api/weather/city/城市id");

//创建一个请求对象

QNetworkRequest request(url);

//发送请求

manager.get(request);

(3)当本次请求完毕QNetworkAccessManager对象会发送finished信号

connect(&manager, &QNetworkAccessManager::finished,this, &HttpDownLoad::read_data);

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

void HttpDownLoad::read_data(QNetworkReply *reply)

{

QByteArray array = reply->readAll();//读取所有数据

}

Json格式数据解析

Json格式数据

对象{} ---对象中只能放键值对

数组[]----数组中只能放同类型数据[{},{},{}], [[],[],[]], [1,2,3,4,5], [“a”,”b”]

键值对 key:value  value可以是对象,数组, 数,字符串

    QByteArray array = reply->readAll();//读取所有数据//json解析QJsonParseError error;QJsonDocument doc = QJsonDocument::fromJson(array, &error);if(error.error != QJsonParseError::NoError)//校验格式是否有错{qDebug()<<"json error";return ;}QJsonObject obj = doc.object();QJsonObject weatherObj = obj.value("data").toObject();QJsonArray forecast = weatherObj.value("forecast").toArray();

UI设计

源码

头文件

#ifndef HTTPDOWNLOAD_H
#define HTTPDOWNLOAD_H#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>namespace Ui {
class HttpDownLoad;
}class HttpDownLoad : public QMainWindow
{Q_OBJECTpublic:explicit HttpDownLoad(QWidget *parent = nullptr);~HttpDownLoad();private slots:void on_getBt_clicked();void read_data(QNetworkReply *reply);
private:Ui::HttpDownLoad *ui;QNetworkAccessManager manager;
};#endif // HTTPDOWNLOAD_H

cpp文件

#include "httpdownload.h"
#include "ui_httpdownload.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonParseError>HttpDownLoad::HttpDownLoad(QWidget *parent) :QMainWindow(parent),ui(new Ui::HttpDownLoad)
{ui->setupUi(this);//关联请求完毕信号finished(QNetworkReply* )connect(&manager, &QNetworkAccessManager::finished,this, &HttpDownLoad::read_data);
}HttpDownLoad::~HttpDownLoad()
{delete ui;
}void HttpDownLoad::on_getBt_clicked()
{QString place = ui->placeBox->currentText();QString num;if(place=="襄阳"){num = "101200201";}if(place == "武汉"){num="101200101";}if(place=="北京"){num = "101010100";}if(place == "广州"){num="101280101";}ui->numEdit->setText(num);QUrl url("http://t.weather.sojson.com/api/weather/city/" + num);//创建一个请求对象QNetworkRequest request(url);//发送请求manager.get(request);
}void HttpDownLoad::read_data(QNetworkReply *reply)
{QByteArray array = reply->readAll();//读取所有数据//json解析QJsonParseError error;QJsonDocument doc = QJsonDocument::fromJson(array, &error);if(error.error != QJsonParseError::NoError)//校验格式是否有错{qDebug()<<"json error";return ;}QJsonObject obj = doc.object();QJsonObject weatherObj = obj.value("data").toObject();QJsonArray forecast = weatherObj.value("forecast").toArray();QLabel *week[4];week[0] = ui->label_week1;week[1] = ui->label_week1_2;week[2] = ui->label_week1_3;week[3] = ui->label_week1_4;QLabel *date[4];date[0] = ui->label_date1;date[1] = ui->label_date2;date[2] = ui->label_date3;date[3] = ui->label_date4;QLabel *hw[5];hw[0] = ui->label_hw;hw[1] = ui->label_hw1;hw[2] = ui->label_hw2;hw[3] = ui->label_hw3;hw[4] = ui->label_hw4;QLabel *type[5];type[0] = ui->label_type;type[1] = ui->label_type1;type[2] = ui->label_type2;type[3] = ui->label_type3;type[4] = ui->label_type4;QLabel *fxfl[5];fxfl[0] = ui->label_fxfl;fxfl[1] = ui->label_fxfl1;fxfl[2] = ui->label_fxfl2;fxfl[3] = ui->label_fxfl3;fxfl[4] = ui->label_fxfl4;QLabel *aqi[5];aqi[0] = ui->label_aqi;aqi[1] = ui->label_aqi1;aqi[2] = ui->label_aqi2;aqi[3] = ui->label_aqi3;aqi[4] = ui->label_aqi4;QLabel *tyim[5];tyim[0] = ui->label_im;tyim[1] = ui->label_im1;tyim[2] = ui->label_im2;tyim[3] = ui->label_im3;tyim[4] = ui->label_im4;//当前QString temp = weatherObj.value("wendu").toString();ui->label_temp->setText(temp);QJsonObject o = forecast.at(0).toObject();ui->label_time->setText(o.value("ymd").toString() + "   " +o.value("week").toString());QString ty = o.value("type").toString();type[0]->setText(ty);if(ty.contains("雨",Qt::CaseSensitive)){this->setStyleSheet("QMainWindow{border-image: url(:/new/prefix1/images/UI3.png)};");  }else{this->setStyleSheet("QMainWindow{border-image: url(:/new/prefix1/images/UI.png)};");}//后4天for(int i=1; i<5; i++){QJsonObject o = forecast.at(i).toObject();qDebug()<<"时间:"<<o.value("ymd").toString();qDebug()<<"最高温度:"<<o.value("high").toString();qDebug()<<"最低温度:"<<o.value("low").toString();qDebug()<<"week:"<<o.value("week").toString();qDebug()<<"空气质量"<<o.value("aqi").toInt();qDebug()<<"fx:"<<o.value("fx").toString();qDebug()<<"fl"<<o.value("fl").toString();qDebug()<<"type:"<<o.value("type").toString();qDebug()<<"-----------------------";week[i-1]->setText(o.value("week").toString());date[i-1]->setText(o.value("ymd").toString());}for(int i=0; i<5; i++){QJsonObject o = forecast.at(i).toObject();hw[i]->setText(o.value("high").toString().mid(3,2) + "~" + o.value("low").toString().mid(3,2) + "℃");QString ty = o.value("type").toString();type[i]->setText(ty);if(ty.contains("雨",Qt::CaseSensitive)){tyim[i]->setStyleSheet("border-image: url(:/new/prefix1/images/3.png);");}else{tyim[i]->setStyleSheet("border-image: url(:/new/prefix1/images/6.png);");}fxfl[i]->setText(o.value("fx").toString() + o.value("fl").toString());int aqi1 = o.value("aqi").toInt();if(aqi1 <50){aqi[i]->setText(QString::number(aqi1) + "优");}if(aqi1>=50 && aqi1< 100){aqi[i]->setText(QString::number(aqi1) + "中");}if(aqi1>=100){aqi[i]->setText(QString::number(aqi1) + "差");}}
}

完毕!

【QT】基于HTTP通信的天气查询的实现相关推荐

  1. 基于C#的全国天气查询API调用代码实例

    全国天气查询API:https://www.juhe.cn/docs/api/id/39 基于C#的全国天气查询API调用代码实例 using System; using System.Collect ...

  2. 基于django的前端天气查询网站

    进入我的博客阅读体验更好哦!博客文章链接:基于django的天气查询网站 (www.lxq.icu) 引言 此项目是之前实训所写,面向的是初学django或初次接触Web框架的人群.因为django是 ...

  3. Qt精美应用程序界面设计,多功能(包含基于sql数据库的音乐、视频播放器、相册,串口、网络调试助手、游戏、天气查询等功能)

    去年寒假疫情,我在家闲着没事,自制了一个由Qt Creator开发的精美多功能程序软件,功能包含音乐播放器.视频播放器.天气查询.串口调试助手.相册.网络调试助手.小游戏等,主界面如下图所示: 界面展 ...

  4. 【5】天猫精灵开放平台实验—基于天气查询模板创建开发屏显页面技能

    文章目录 天猫精灵开放平台实验-基于模板创建开发屏显页面技能 一.前提准备 二.登录天猫精灵开放平台 (一)创建新技能 1.创建语音技能 2.填写基本信息 (二)创建后端服务 1.创建后端服务 2.关 ...

  5. 基于python的类的调用(快递查询,天气查询,学员管理,旅游查询,电影查询,景点查询,手机销售系统,内涵段子,手机号id查询))

    一.汇总模型 #模块<==>python文件 #引入express中的KD类 from express import KD from weather import WT from stud ...

  6. qt中socket通信流程图_基于Qt的局域网通信设计说明书.doc

    文档控制记录 序号版本日期修改内容修改人审批人1V1.02017-04-24创建2 目录目录4 辅助功能设计14 1目的 本文主要介绍利用Qt实现局域网通信的主要实现流程和一些技术知识点的设计说明. ...

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

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

  8. 基于node的cmd迷你天气查询工具

    1.前几天网上看到的,于是自己小改了一下,更换了天气查询的接口,当作练习一下node. 2.收获挺大的,捣鼓了一天,终于学会了发布npm包. 3.接下来,就介绍一下这个 mini-tianqi 的主要 ...

  9. 毕业设计 : 基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人

    0 简介 Hi,大家好,这里是三文工作室,今天向大家介绍一个 单片机项目 基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人 大家可用于 课程设计 或 毕业设计 print(" ...

  10. 基于Android实现的天气预测APP

    基于Android开发的天气预测APP 一.相关技术 1.1 网络 网络数据源使用 Retrofit 库访问彩云 API 提供的 Webservice 接口来实现. Retrofit 通过封装络请求和 ...

最新文章

  1. mssql mysql 语法区别_mssql与mysql区别之——变量区别
  2. linux tr 字符串,linux tr命令-转换或删除输入的字符的
  3. 初识 Angularjs1.x ,了解5个W和1个H
  4. iOS---------- MBProgressHUD (1.0.0)的变动
  5. 新松机器人BG总裁高峰_青春,就是用来奋斗的——记沈阳新松机器人自动化股份有限公司创始人兼总裁曲道奎...
  6. POJ1917 UVA10361 Automatic Poetry【文本】
  7. Spring Boot 异常处理,值得学习!
  8. paip.复制文件 文件操作 api的设计uapi java python php 最佳实践
  9. (QT学习笔记):QListWidget、QTreeWidget、 QTableWidget的基本使用
  10. 基于支持向量机的图像分类系统(MATLAB GUI界面版)
  11. XP下安装IIS6.0的办法
  12. tkinter -- tcp
  13. 陈老师排课12A(普通新课表)排课方法
  14. RTX腾讯通基本功能
  15. 桂林理工大学专科计算机专业在哪个校区,桂林理工大学专科在哪个校区
  16. python导入类中函数不能用_我可以使用本地类中导入模块中的函数吗?(Python)...
  17. 青岛——生命转折的地方
  18. 常见的股票技术指标到底能赚钱吗?从量化交易的角度告诉你
  19. 第三章 matlab学习入门之编程基础
  20. 如何透过上层div点击下层的元素

热门文章

  1. Linux c语言 creat参数,C语言open和creat函数
  2. Power Spectral Density
  3. asp.net my sqlHelper
  4. DOM方式操作元素属性
  5. 转: Protobuf 的 proto3 与 proto2 的区别
  6. vue实现一个移动端屏蔽滑动的遮罩层
  7. vs2005c#能build通过,但是run不了
  8. zookeeper安装和应用场合(名字,配置,锁,队列,集群管理)
  9. volatile一题
  10. css 选择器的应用