【QT】基于HTTP通信的天气查询的实现
目录
设计目标
效果展示
实现过程
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通信的天气查询的实现相关推荐
- 基于C#的全国天气查询API调用代码实例
全国天气查询API:https://www.juhe.cn/docs/api/id/39 基于C#的全国天气查询API调用代码实例 using System; using System.Collect ...
- 基于django的前端天气查询网站
进入我的博客阅读体验更好哦!博客文章链接:基于django的天气查询网站 (www.lxq.icu) 引言 此项目是之前实训所写,面向的是初学django或初次接触Web框架的人群.因为django是 ...
- Qt精美应用程序界面设计,多功能(包含基于sql数据库的音乐、视频播放器、相册,串口、网络调试助手、游戏、天气查询等功能)
去年寒假疫情,我在家闲着没事,自制了一个由Qt Creator开发的精美多功能程序软件,功能包含音乐播放器.视频播放器.天气查询.串口调试助手.相册.网络调试助手.小游戏等,主界面如下图所示: 界面展 ...
- 【5】天猫精灵开放平台实验—基于天气查询模板创建开发屏显页面技能
文章目录 天猫精灵开放平台实验-基于模板创建开发屏显页面技能 一.前提准备 二.登录天猫精灵开放平台 (一)创建新技能 1.创建语音技能 2.填写基本信息 (二)创建后端服务 1.创建后端服务 2.关 ...
- 基于python的类的调用(快递查询,天气查询,学员管理,旅游查询,电影查询,景点查询,手机销售系统,内涵段子,手机号id查询))
一.汇总模型 #模块<==>python文件 #引入express中的KD类 from express import KD from weather import WT from stud ...
- qt中socket通信流程图_基于Qt的局域网通信设计说明书.doc
文档控制记录 序号版本日期修改内容修改人审批人1V1.02017-04-24创建2 目录目录4 辅助功能设计14 1目的 本文主要介绍利用Qt实现局域网通信的主要实现流程和一些技术知识点的设计说明. ...
- 树莓派练手小项目---基于树莓派构建天气查询系统,实现内容的网页自动化检索功能
目录 一.写在前面 二.基于树莓派构建天气查询系统 三.基于树莓派实现网页内容的自动化检索 四.有关于树莓派的其他小提醒,小技巧 Author:qyan.li Date:2022.6.19 Topic ...
- 基于node的cmd迷你天气查询工具
1.前几天网上看到的,于是自己小改了一下,更换了天气查询的接口,当作练习一下node. 2.收获挺大的,捣鼓了一天,终于学会了发布npm包. 3.接下来,就介绍一下这个 mini-tianqi 的主要 ...
- 毕业设计 : 基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人
0 简介 Hi,大家好,这里是三文工作室,今天向大家介绍一个 单片机项目 基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人 大家可用于 课程设计 或 毕业设计 print(" ...
- 基于Android实现的天气预测APP
基于Android开发的天气预测APP 一.相关技术 1.1 网络 网络数据源使用 Retrofit 库访问彩云 API 提供的 Webservice 接口来实现. Retrofit 通过封装络请求和 ...
最新文章
- mssql mysql 语法区别_mssql与mysql区别之——变量区别
- linux tr 字符串,linux tr命令-转换或删除输入的字符的
- 初识 Angularjs1.x ,了解5个W和1个H
- iOS---------- MBProgressHUD (1.0.0)的变动
- 新松机器人BG总裁高峰_青春,就是用来奋斗的——记沈阳新松机器人自动化股份有限公司创始人兼总裁曲道奎...
- POJ1917 UVA10361 Automatic Poetry【文本】
- Spring Boot 异常处理,值得学习!
- paip.复制文件 文件操作 api的设计uapi java python php 最佳实践
- (QT学习笔记):QListWidget、QTreeWidget、 QTableWidget的基本使用
- 基于支持向量机的图像分类系统(MATLAB GUI界面版)
- XP下安装IIS6.0的办法
- tkinter -- tcp
- 陈老师排课12A(普通新课表)排课方法
- RTX腾讯通基本功能
- 桂林理工大学专科计算机专业在哪个校区,桂林理工大学专科在哪个校区
- python导入类中函数不能用_我可以使用本地类中导入模块中的函数吗?(Python)...
- 青岛——生命转折的地方
- 常见的股票技术指标到底能赚钱吗?从量化交易的角度告诉你
- 第三章 matlab学习入门之编程基础
- 如何透过上层div点击下层的元素