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"));   //设置url
    QNetworkReply *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": "雨虽小,注意保暖别感冒"
        }
    }
}
  • 由于网络请求是异步的,用户界面不会阻塞,这提供了更好的用户体验。槽函数在这里功不可没!另外 感谢哈工程大学通讯专业的同学,上面代码不是我写的:)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.Android逆向协议-配置FD抓包环境

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:微尘网校 上一个内容:5.Android逆向协议-初识HTTP和HTTPS协议 工具下载: 链接:https://pan.baidu.…

20.《C语言》——【移位操作符】

🌹开场语 亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能&a…

大数据之Linux部署常用命令脚本封装

文章目录 编写集群命令执行脚本xcall集群命令执行1. 脚本需求2. 需求分析3. 脚本实现3.1 创建脚本存放目录3.2 编写xcall脚本3.3 修改脚本执行权限3.4 测试脚本 编写集群分发脚本xsync集群分发脚本1. 脚本需求2. 需求分析3. 脚本实现3.1 创建脚本存放目录3.2 编写xsync脚本3.3 …

cad由于找不到mfc140u.dll的解决方法,彻底解决mfc140u.dll丢失问题

在计算机辅助设计(CAD)的时候,我们可能会遇到各种错误和问题。其中,“CAD由于找不到mfc140u.dll,无法继续执行代码”的错误提示。这个问题可能会导致CAD无法启动运行,因此,我希望通过分享我的经…

外籍学员报到,四川眼科医院开启国际屈光手术专科医生培训

“能够来到中国、来到四川眼科医院学习,我真的很幸运!”这个夏天,对于马来西亚眼科医生Ivan Cheng En Yoo来说,充满了期待和挑战。他是首位来到四川眼科医院进修学习的马来西亚籍医生,Ivan Cheng将在周进院长的带领下&…

AzureDataFactory 实体间的关联如何处理(Lookup)

使用ADF从外部数据源(例如Sql Server)往D365推数时,实体间的Lookup一定是要做的,本篇以我项目中的设备为例,设备表中有产品的lookup字段 设备表结构如下 msdyn_customerasset 表名ID 设备表guidSerialNumber设备序列号ProductCode设备对应的…

docker部署简单的Kafka

文章目录 1. 拉取镜像2. 运行创建网络运行 ZooKeeper 容器运行 Kafka 容器 3. 简单的校验1. 检查容器状态2. 检查 ZooKeeper 日志3. 检查 Kafka 日志4. 使用 Kafka 命令行工具检查5. 创建和删除测试主题 1. 拉取镜像 选择一组兼容性好的版本。 docker pull bitnami/kafka:3.6…

2024“国培“来也UiBot6.0 RPA数字机器人开发综合应用

前言 (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~) 国培笔记: 依次读取数组中每个元素 输出调试信息 [ value=[ "vivian", value[0] "老师", "上午好,O(∩_∩)O哈哈~" ], v…

小红书 达芬奇:生活问答 AI 机器人

小红书去年 9 月开始内测的生活问答 AI 机器人:达芬奇,现在可以在小红书 APP 上用了 得益于小红书平台的特性,该助手擅长吃、住、宠、喝、学等等各类生活知识,目前还在搞活动,写评测笔记最高得 666 元

DMA学习笔记

参考文章 https://blog.csdn.net/as480133937/article/details/104927922 DMA简介 DMA,全称Direct Memory Access,即直接存储器访问。DMAC 即 DMA 控制器,提供了一种硬件的数据传输方式,无需 CPU 的介入,可以处理外…

VS Code 常用快捷键大全

Visual Studio Code 是目前最好用的代码编辑器之一。它提供了许多开箱即用的功能以及丰富的第三方扩展,本文将分享常用的 VS Code 快捷键,助你提高开发效率! 代码导航 跳转指定行:快速跳转到文件中的指定行,只需按下快…

从0开始transformer代码理解(附带调试和个人原理理解)

代码来源 本次代码来源自github https://github.com/graykode/nlp-tutorial 里面的5.1 transformer代码 本文目录 代码来源第一步 数据准备(从main函数开始)make_batch函数 **Transformer 主体函数定义代码**Encoder层词向量维度嵌入掩码部分实现多层e…

Linux运维之需掌握的基本Linux命令

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 目录 一、SHELL 二、执行命令 三、常用系统工作命令 四、系统状态检测命令 五、查找定位文件命令 六、文本文件编辑命令 七、文件目录管理命令…

echarts--Tree的label上添加图片

使用echarts的rich富文本,配合lable的formatter去实现 主要代码:label里 rich: {img1: {backgroundColor: {image: Cloudy,},height: 40}},formatter: function (param) {var res "";res {img1|} param.name;return res;}, 如果想要哪一节…

Python 生成Md文件带超链 和 PDF文件 带分页显示内容

software.md # -*- coding: utf-8 -*- import os f open("software.md", "w", encoding"utf-8") f.write(内部测试版2024 MD版\n) for root, dirs, files in os.walk(path): dax os.path.basename(root)if dax "":print("空白…

大模型补贴政策来了!!!

广州琶洲人工智能与数字经济试验区管理委员会 广州市海珠区科技工业商务和信息化局关于印发广州市海珠区建设人工智能大模型应用示范区实施细则的通知 各有关单位: 为进一步促进海珠区人工智能大模型产业发展,加快建设人工智能大模型应用示范区&#xf…

昇思MindSpore学习总结八——模型保存与加载

在训练网络模型的过程中,实际上我们希望保存中间和最后的结果,用于微调(fine-tune)和后续的模型推理与部署,接下来将介绍如何保存与加载模型。 1.构建模型 import numpy as np import mindspore from mindspore impo…

【RocketMQ】记录一次RocketMQ消费延迟问题排查思路

文章目录 背景问题排查Consumer负载均衡机制订阅关系的一致 背景 业务团队反馈使用我提供的RocketMQ集群,上游生产的消息,部分消息,消费程序需要等1分钟,甚至几分钟后,才能收到。 问题排查 见怪不怪,大部…

TapData 医疗美容行业数字化白皮书上线

随着颜值经济的发展,人们追求“美”的热情也不断高涨,而作为近年来被资本频频下注的赛道之一,医疗美容逐渐走进大众视野。 一方面,社会对外貌的重视程度不断提升,越来越多的人愿意通过医疗美容来提升自身形象&#xf…

后端加前端Echarts画图示例全流程(折线图,饼图,柱状图)

本文将带领读者通过一个完整的Echarts画图示例项目,演示如何结合后端技术(使用Spring Boot框架)和前端技术(使用Vue.js或React框架)来实现数据可视化。我们将实现折线图、饼图和柱状图三种常见的数据展示方式&#xff…