qt6 通过http查询天气的实现

步骤如下: 

  1. cmakelist 当中,增加如下配置
  2.  引入包
  3.  访问远端api
  4.  解析返回的数据

  1. cmakelist 当中,增加如下配置,作用是引入Network库。
    1.  引入包

 3、访问远端api

void Form1::on_pushButton_clicked()
{//根据URL(http://t.weather.itboy.net/api/weather/city/101010100)http请求查询温度信息QNetworkAccessManager *manager = new QNetworkAccessManager(this);   //网络管理器QNetworkRequest request;   //请求request.setUrl(QUrl("http://t.weather.itboy.net/api/weather/city/101010100"));   //设置urlQNetworkReply *reply = manager->get(request); //发送get请求connect(reply, &QNetworkReply::finished, [=](){   //请求完成后的处理if(reply->error() == QNetworkReply::NoError)  {QByteArray data = reply->readAll();QJsonParseError json_error;QJsonDocument doc = QJsonDocument::fromJson(data, &json_error);  //解析json数据if(json_error.error == QJsonParseError::NoError)  {if(doc.isObject())  {QJsonObject obj = doc.object();  //获取json对象if(obj.contains("data"))  //判断是否包含data{QJsonValue value = obj.value("data");  //获取data数据if(value.isObject()){QJsonObject data = value.toObject();  //获取data对象if(data.contains("wendu"))   //判断是否包含wendu{QJsonValue wendu = data.value("wendu");   //获取温度ui->label->setText("温度:" + wendu.toString());  //显示温度}}}}}}reply->deleteLater();  //释放资源  这个很重要!!!});}

这段代码是在Qt框架中,特别是使用Qt Network模块,来实现一个HTTP GET请求以查询指定城市的天气温度信息。这里详细解释每一步的作用和目的:

  1. 创建QNetworkAccessManager实例

  2. QNetworkAccessManager *manager = new QNetworkAccessManager(this);

    QNetworkAccessManager是Qt中用于发送网络请求的类。这里创建了一个QNetworkAccessManager的实例,并将this(假设是某个QWidget或QObject的子类,如Form1)作为父对象。这样做可以确保当Form1被销毁时,QNetworkAccessManager也会被正确地销毁。

  3. 设置请求

  4. QNetworkRequest request; 
    request.setUrl(QUrl("http://t.weather.itboy.net/api/weather/city/101010100"));

    创建一个QNetworkRequest对象并设置其URL为需要查询的天气API的URL。这里假设URL是正确的,并且服务器会返回JSON格式的天气数据。

  5. 发送GET请求

  6. QNetworkReply *reply = manager->get(request);

    通过QNetworkAccessManagerget方法发送GET请求。这个方法返回一个QNetworkReply对象的指针,该对象将用于后续处理HTTP响应。

  7. 处理响应
    使用connect函数将QNetworkReplyfinished信号连接到一个lambda表达式,该表达式在请求完成时执行。

    • 检查错误:首先检查响应中是否有错误。如果没有错误(QNetworkReply::NoError),则继续处理数据。
    • 读取并解析JSON数据:使用readAll方法读取响应数据,然后尝试使用QJsonDocument::fromJson方法解析这些数据为QJsonDocument对象。解析过程中,QJsonParseError对象用于捕获任何可能的解析错误。
    • 遍历JSON对象:解析成功后,检查JSON文档是否是一个对象,并遍历它以查找包含温度信息的data字段。如果找到data字段,并且它是一个对象,则进一步查找wendu(温度)字段。
    • 显示温度:如果找到wendu字段,将其值转换为字符串,并设置到UI的某个标签(假设为ui->label)上。
  8. 资源释放

  9. reply->deleteLater();

    在lambda表达式的末尾调用deleteLater方法。这是为了确保在lambda表达式执行完毕后,QNetworkReply对象能够被正确地删除。这是因为QNetworkReply对象在响应完成后仍然占用内存,直接删除可能会导致问题,而deleteLater会将其放入事件循环中稍后删除。

注意

  • 我们图形化界面中 ui->label
  • 这段代码API返回的数据格式是已知的,
{"message": "success感谢又拍云(upyun.com)提供CDN赞助","status": 200,"date": "20240703","time": "2024-07-03 19:15:24","cityInfo": {"city": "北京市","citykey": "101010100","parent": "北京","updateTime": "15:46"},"data": {"shidu": "51%","pm25": 31.0,"pm10": 42.0,"quality": "优","wendu": "28.6","ganmao": "各类人群可自由活动","forecast": [{"date": "03","high": "高温 31℃","low": "低温 17℃","ymd": "2024-07-03","week": "星期三","sunrise": "04:50","sunset": "19:46","aqi": 67,"fx": "南风","fl": "2级","type": "晴","notice": "愿你拥有比阳光明媚的心情"},{"date": "04","high": "高温 30℃","low": "低温 21℃","ymd": "2024-07-04","week": "星期四","sunrise": "04:51","sunset": "19:46","aqi": 85,"fx": "东南风","fl": "2级","type": "小雨","notice": "雨虽小,注意保暖别感冒"},{"date": "05","high": "高温 32℃","low": "低温 22℃","ymd": "2024-07-05","week": "星期五","sunrise": "04:51","sunset": "19:46","aqi": 94,"fx": "西南风","fl": "2级","type": "多云","notice": "阴晴之间,谨防紫外线侵扰"},{"date": "06","high": "高温 29℃","low": "低温 23℃","ymd": "2024-07-06","week": "星期六","sunrise": "04:52","sunset": "19:45","aqi": 84,"fx": "东北风","fl": "2级","type": "小雨","notice": "雨虽小,注意保暖别感冒"},{"date": "07","high": "高温 32℃","low": "低温 23℃","ymd": "2024-07-07","week": "星期日","sunrise": "04:53","sunset": "19:45","aqi": 84,"fx": "南风","fl": "2级","type": "阴","notice": "不要被阴云遮挡住好心情"},{"date": "08","high": "高温 35℃","low": "低温 23℃","ymd": "2024-07-08","week": "星期一","sunrise": "04:53","sunset": "19:45","aqi": 77,"fx": "西南风","fl": "2级","type": "晴","notice": "愿你拥有比阳光明媚的心情"},{"date": "09","high": "高温 34℃","low": "低温 24℃","ymd": "2024-07-09","week": "星期二","sunrise": "04:54","sunset": "19:44","aqi": 62,"fx": "东南风","fl": "1级","type": "大雨","notice": "出门最好穿雨衣,勿挡视线"},{"date": "10","high": "高温 34℃","low": "低温 25℃","ymd": "2024-07-10","week": "星期三","sunrise": "04:55","sunset": "19:44","aqi": 61,"fx": "东北风","fl": "2级","type": "小雨","notice": "雨虽小,注意保暖别感冒"},{"date": "11","high": "高温 34℃","low": "低温 26℃","ymd": "2024-07-11","week": "星期四","sunrise": "04:55","sunset": "19:44","aqi": 58,"fx": "东南风","fl": "2级","type": "多云","notice": "阴晴之间,谨防紫外线侵扰"},{"date": "12","high": "高温 30℃","low": "低温 25℃","ymd": "2024-07-12","week": "星期五","sunrise": "04:56","sunset": "19:43","aqi": 63,"fx": "东南风","fl": "2级","type": "阴","notice": "不要被阴云遮挡住好心情"},{"date": "13","high": "高温 35℃","low": "低温 25℃","ymd": "2024-07-13","week": "星期六","sunrise": "04:57","sunset": "19:43","aqi": 47,"fx": "东南风","fl": "2级","type": "阴","notice": "不要被阴云遮挡住好心情"},{"date": "14","high": "高温 35℃","low": "低温 25℃","ymd": "2024-07-14","week": "星期日","sunrise": "04:57","sunset": "19:42","aqi": 66,"fx": "东南风","fl": "2级","type": "多云","notice": "阴晴之间,谨防紫外线侵扰"},{"date": "15","high": "高温 32℃","low": "低温 23℃","ymd": "2024-07-15","week": "星期一","sunrise": "04:58","sunset": "19:42","aqi": 61,"fx": "东风","fl": "2级","type": "中雨","notice": "记得随身携带雨伞哦"},{"date": "16","high": "高温 30℃","low": "低温 21℃","ymd": "2024-07-16","week": "星期二","sunrise": "04:59","sunset": "19:41","aqi": 54,"fx": "东风","fl": "2级","type": "中雨","notice": "记得随身携带雨伞哦"},{"date": "17","high": "高温 35℃","low": "低温 23℃","ymd": "2024-07-17","week": "星期三","sunrise": "05:00","sunset": "19:40","aqi": 46,"fx": "西南风","fl": "2级","type": "多云","notice": "阴晴之间,谨防紫外线侵扰"}],"yesterday": {"date": "02","high": "高温 25℃","low": "低温 17℃","ymd": "2024-07-02","week": "星期二","sunrise": "04:50","sunset": "19:46","aqi": 25,"fx": "北风","fl": "2级","type": "小雨","notice": "雨虽小,注意保暖别感冒"}}
}
  • 由于网络请求是异步的,用户界面不会阻塞,这提供了更好的用户体验。槽函数在这里功不可没!另外 感谢哈工程大学通讯专业的同学,上面代码不是我写的:)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/371357.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】在线求助命令--help,man page , info page

我们知道Linux有很多的命令,那LInux要不要背命令? 答案是背最常用的那些就行了 那有的时候我们想查询一些命令的详细用法该怎么办呢? 这里我给出3种方法 1.--help --help的使用方法很简单啊 要查询的命令 --help 我们看个例子 这里我只…

利用 Hexo 搭建个人博客

〇、前言 本文将会讨论,如何将 CSDN 上的博客,拉取到本地,然后PicGo、Hexo、Github 等工具建立个人博客,环境为 Ubuntu 20.04。 一、利用 Hexo 预备工作 首先安装 Node.js、npm、git工具。 > node -v v12.22.9 > npm -…

计算组的妙用!!页面权限控制

需求描述: 某些特殊的场景下,针对某页看板,需要进行数据权限卡控,但是又不能对全部的数据进行RLS处理,这种情况下可以利用计算组来解决这个需求。 实际场景 事实表包含产品维度和销售维度 两个维度属于同一公司下面的…

方向导数和梯度

方向导数和梯度 1 导数的回忆2 偏导数及其向量形式偏导数的几何意义偏导数的向量形式 3 方向导数向量形式几何意义方向导数和偏导的关系 4 梯度5 梯度下降算法 1 导数的回忆 导数的几何意义如图所示: 当 P 0 P_{0} P0​点不断接近 P P P时,导数如下定义…

Springboot学习之用EasyExcel4导入导出数据(基于MyBatisPlus)

一、POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…

Feign-未完成

Feign Java中如何实现接口调用&#xff1f;即如何发起http请求 前三种方式比较麻烦&#xff0c;在发起请求前&#xff0c;需要将Java对象进行序列化转为json格式的数据&#xff0c;才能发送&#xff0c;然后进行响应时&#xff0c;还需要把json数据进行反序列化成java对象。 …

短信验证码实现

一、设置AccessKey 创建用户并配置使用权限&#xff0c;使我们拥有调用 aliyunAPI 的权限&#xff0c;之后会生成 AccessKeyID 和 AccessKey密码&#xff0c;后面我们会使用到。需要注意的是 AccessKeyID 和 AccessKey密码生成后我们需要将他保存起来&#xff0c;否则后期无法查…

multisim中关于74ls192n和DSWPK开关仿真图分析(减法计数器)

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

如何监控和分析 PostgreSQL 中的查询执行计划?

文章目录 一、为什么监控和分析查询执行计划很重要二、PostgreSQL 中用于获取查询执行计划的方法三、理解查询执行计划的关键元素四、通过示例分析查询执行计划五、优化查询执行计划的常见策略六、使用工具辅助分析七、结合实际案例的详细分析八、总结 在 PostgreSQL 数据库中&…

nginx的匹配及重定向

一、nginx的匹配&#xff1a; nginx中location的优先级和匹配方式&#xff1a; 1.精确匹配&#xff1a;location / 对字符串进行完全匹配&#xff0c;必须完全符合 2.正则匹配&#xff1a;location ^~ ^~ 前缀匹配&#xff0c;以什么为开头 ~区分大小写的匹配 ~* 不区分…

第十四届蓝桥杯省赛C++B组G题【子串简写】题解(AC)

题目大意 给定字符串 s s s&#xff0c;字符 a , b a, b a,b&#xff0c;问字符串 s s s 中有多少个 a a a 开头 b b b 结尾的子串。 解题思路 20pts 使用二重循环枚举左端点和右端点&#xff0c;判断是否为 a a a 开头 b b b 结尾的字符串&#xff0c;是则答案加一…

【74CH160组成60进制0-59】2021-11-22

缘由60进制计数 到达60后显示ff-嵌入式-CSDN问答 缘由《数电》用两片74160接成29进制计数器应该怎么接呢&#xff1f;-嵌入式-CSDN问答

Gitlab Fork Workflow(协作工作流)

Gitlab Fork WorkFlow&#xff08;协作工作流&#xff09; Fork WorkFlow用于团队间的协作开发。在开发过程中&#xff0c;我们都需要将最新修改的代码合并到代码库上&#xff0c;在代码合并之前&#xff0c;为了保证代码符合上传要求&#xff08;符合需求、代码规范等&#xf…

【MySQL基础篇】多表查询

1、多表关系 概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构操作设计时&#xff0c;会根据业务需求及业务模板之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种…

Windows如何查看端口是否占用,并结束端口进程

需求与问题&#xff1a;前后端配置了跨域操作&#xff0c;但是仍然报错&#xff0c;可以考虑端口被两个程序占用&#xff0c;找不到正确端口或者后端接口书写是否规范&#xff0c;特别是利用Python Flask书写时要保证缩进是否正确&#xff01; Windows操作系统中&#xff0c;查…

实验五 图像增强—空域滤波

一、实验目的 了解图像平滑滤波器&#xff08;均值滤波和中值滤波&#xff09;和图像锐化算子&#xff08;Sobel算子、Prewitt算子、Laplacian算子&#xff09;在工程领域中的应用&#xff1b;理解图像平滑滤波器和图像锐化算子的工程应用范围&#xff1b;掌握图像平滑滤波器和…

Winform中使用HttpClient实现调用http的post接口并设置传参content-type为application/json示例

场景 Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类&#xff1a; Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类_winform解析json-CSDN博客 上面使用HttpClient调用post接口时使用的HttpCon…

SQL-DCL(三)

一.DCL介绍 DCL英文全称是Data Control Language(数据库控制语言),用来管理数据库 用户,控制数据库的访问权限。 二.两个方面 1.数据库可以由那些用户访问 2.可以访问那些内容 三.DCL-管理用户 1.查询用户 USE mysql SELECT * FROM user 2.创建用户 CREATE USER…

k8s 部署 springboot 项目内存持续增长问题分析解决

写在前面 工作中遇到&#xff0c;请教公司前辈解决&#xff0c;简单整理记忆博文内容涉及一次 GC 问题的分析以及解决理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真做完…

Appium adb 获取appActivity

方法一&#xff08;最简单有效的方法&#xff09; 通过cmd命令&#xff0c;前提是先打开手机中你要获取包名的APP adb devices -l 获取连接设备详细信息 adb shell dumpsys activity | grep mFocusedActivity 有时获取到的不是真实的Activity 方法二 adb shell monkey -p …