qt6 通过http查询天气的实现

news2024/10/6 12:24:36

步骤如下: 

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GoLand 2024 for Mac GO语言集成开发工具环境

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件(适合自己的M芯片版或Intel芯片版),将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功3、打开访达,点击【文…

Flask 数据创建时出错

当我们在使用 Flask 创建数据时遇到错误,可能有多种原因,包括代码错误、数据库配置问题或依赖项错误。具体情况我会总结成一篇文章记录下,主要是归类总结一些常见的解决方法和调试步骤,帮助大家解决问题: 1、问题背景 …

013、MongoDB常用操作命令与高级特性深度解析

目录 MongoDB常用操作命令与高级特性深度解析 1. 数据库操作的深入探讨 1.1 数据库管理 1.1.1 数据库统计信息 1.1.2 数据库修复 1.1.3 数据库用户管理 1.2 数据库事务 2. 集合操作的高级特性 2.1 固定集合(Capped Collections) 2.2 集合验证(Schema Validation) 2.…

如何批量创建、提取和重命名文件夹!!!

你是否还在一个一个手动创建文件名! 你是否还在一个一个手动提取文件名! 你是否还在一个一个手动修改文件名! 请随小生一起批量自动创建、提取、重命名! 1、批量创建文件夹 【案例】创建1日-31日共31个文件夹 【第一步】在A列…

VirtualBox Ubuntu Sever配置双网卡

Ubuntu 版本:Ubuntu Server 2404 vitrualBox 网卡配置: 如上配置后,ifconfig 只能看到 网卡1 应用了。要应用 网卡2 需要更改文件 /etc/netplan/50-cloud-init.yaml(不同的ubuntu版本这个文件名可能不同) 首先 ifcon…

如何在Linux上删除Systemd服务

Systemd是Linux 操作系统的系统和服务管理器,提供控制系统启动时启动哪些服务的标准流程。 有时,您可能出于各种原因需要删除systemd服务,例如不再需要、与其他服务冲突,或者您只是想清理系统。 Systemd使用单元文件来管理服务&…

OBD诊断(ISO15031) 04服务

文章目录 功能简介ISO 9141-2、ISO 14230-4和SAE J1850的诊断服务定义1、清除/重置与排放相关的诊断信息请求消息定义2、请求与排放相关的DTC响应消息定义3、报文示例 ISO 15765-4的诊断服务定义1、请求与排放相关的DTC请求消息定义2、请求与排放相关的DTC响应消息定义3、否定响…

深入详解RocketMQ源码安装与调试

1.源码下载 http://rocketmq.apache.org/dowloading/releases/ 2. 环境要求 64位系统JDK1.8(64位)Maven 3.2.x

keil5模拟 仿真 报错没有读写权限

debug*** error 65: access violation at 0x4002100C : no write permission 修改为: Dialog DLL默认是DCM3.DLL Parameter默认是-pCM3 应改为 Dialog DLL默认是DARMSTM.DLL Parameter默认是-pSTM32F103VE

计算机网络——数据链路层(点对点协议PPP)

点对点协议PPP的概述 对于点对点的链路,目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。 它主要应用于两个场景: 用户计算机与ISP之间的链路层协议就是点对点协议 PPP,1999年公布了回以在以太网上运行的PPP协…

配音软件有哪些?分享五款超级好用的配音软件

随着嫦娥六号的壮丽回归,举国上下都沉浸在这份自豪与激动之中。 在这样一个历史性的时刻,我们何不用声音记录下这份情感,让这份记忆以声音的形式流传? 无论是制作视频分享这份喜悦,还是创作音频讲述探月故事&#xff…

AI 会淘汰程序员吗?

前言 前些日子看过一篇文章,说国外一位拥有 19 年编码经验、会 100% 手写代码的程序员被企业解雇了,因为他的竞争对手,一位仅有 4 年经验、却善于使用 Copilot、GPT-4 的后辈,生产力比他更高,成本比他更低&#xff0c…

【分布式系统】监控平台Zabbix对接grafana

以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署(命令截图版)-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 一.安装grafana并启动 添加一台服务器192.168.80.104 初始化操作 systemctl disable --now firewalld set…

<电力行业> - 《第16课:电力领域(二)》

3 制造 3.1 电气制造厂 发电厂发电需要发电机,变电站升压降压需要变压器,输电线路输送电能需要电缆,这些主要电气设备的制造商,就是电力设备厂家。 电气设备制造是电力领域市场最基础也是最开放的领域,电力行业内最…

BugKu-WEB-sodirty

目录 前言 正文 信息收集 代码审计 验证 结尾 前言 七月始,暑假副本也正式开启 正文 信息收集 看着貌似没啥意义 看样子是有备份文件 下载下来 快速审计一下 代码审计 来吧 app.js没啥东西,主要是功能是实现error 我们找一找有没有index.js 找到了 \www\routes\in…

ESP32-VScode环境设置

目录 前言 一、安装VSCode 二、安装ESP32环境 1.安装ESP-IDF 2.ESP-IDF设置 3:开始配置环境 4.打开example进行验证 5.烧录 6.调整波特率 总结 前言 环境:Visual Studio Code 芯片:ESP32 说实话,这是我装的时间最长的一个环境&…

【数据分享】《中国金融年鉴》1986-2020年PDF版

而今天要免费分享的数据就是1986-2020年间出版的《中国金融年鉴》并以多格式提供免费下载。(无需分享朋友圈即可获取) 数据介绍 《中国金融年鉴》自1986年起,逐年记录着中国金融领域的发展历程、政策变化和市场动态。这部年鉴不仅是金融专业…

分析数据不要太老实,有BI方案就用起来——奥威BI软件

在当今数据驱动的时代,企业对于数据分析的需求日益迫切。然而,面对海量的数据和复杂的分析需求,许多企业仍停留在传统的手工分析模式,这不仅效率低下,还容易出错。幸运的是,像奥威BI这样的数据分析软件提供…

【深度学习】【Lora训练3】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

为了便于使用,构建一个docker镜像来使用秋叶包。2024年6月26日。 docker run -it --gpus all -v /ssd/xiedong:/datax --net host kevinchina/deeplearning:pytorch2.3.0-cuda12.1-cudnn8-devel-xformers bashgit clone --recurse-submodules https://github.com/A…

SXSSFWorkbook导出百万级数据性能和行数问题解决

先说我的背景:我的情况是从iotdb中查询数据,然后解析成需要的格式 通过SXSSFWorkbook导出到excel,实验数据频次n*5000/s,n表示我本次实验选择的通道数量,可想而知我几分钟的实验就会有几百万的数据,并且要对数据进行解析然后画表导出。 再说遇到的问题: 1.大数据量势必出…