qt获取天气代码

2023-05-16

qt显示天气信息

    • 1 发送网络请求获取天气数据
      • 1.1 需要包含的头文件
      • 1.2 创建QNetworkAccessManager对象
      • 1.3 发送请求
      • 1.4 获取数据并解析
    • 2 天气JSON格式数据
    • 3 demo代码
    • 4 最终效果

1 发送网络请求获取天气数据

1.1 需要包含的头文件

#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

1.2 创建QNetworkAccessManager对象

头文件中定义:

	QNetworkAccessManager *manager;  //请求句柄

cpp文件中创建对象并绑定槽:

 	manager = new QNetworkAccessManager(this);  //新建QNetworkAccessManager对象
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//关联信号和槽

1.3 发送请求

void MainWindow::sendQuest(QString cityStr)
{
    char quest_array[256] = "http://wthrcdn.etouch.cn/weather_mini?city=";
    QNetworkRequest quest;
    sprintf(quest_array, "%s%s", quest_array, cityStr.toUtf8().data());
    quest.setUrl(QUrl(quest_array));
    quest.setHeader(QNetworkRequest::UserAgentHeader, "RT-Thread ART");
    manager->get(quest);    /*发送get网络请求*/
}

1.4 获取数据并解析

void MainWindow::replyFinished(QNetworkReply *reply)  //天气数据处理槽函数
{
    QString all = reply->readAll();
    ui->textBrowser->setText(all); //将接收到的数据显示出来

    QJsonParseError err;
    QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(), &err);//解析json对象
    qDebug() << "recv weather data! error:"<< err.error;

    if (!json_recv.isNull())
    {
        QJsonObject object = json_recv.object();
        if (object.contains("data"))
        {
            QJsonValue value = object.value("data");  // 获取指定 key 对应的 value
            if (value.isObject())
            {
                QJsonObject object_data = value.toObject();
                if (object_data.contains("forecast"))
                {
                    QJsonValue value = object_data.value("forecast");

                    if (value.isArray())
                    {
                        QJsonObject today_weather = value.toArray().at(0).toObject();

                        QString weather_type = today_weather.value("type").toString();
                        QString tuijian = object.value("data").toObject().value("ganmao").toString();
                        QString low = today_weather.value("low").toString();
                        QString high = today_weather.value("high").toString();
                        QString wendu = low.mid(low.length() - 4, 4) + "~" + high.mid(high.length() - 4, 4);
                        QString strength = today_weather.value("fengli").toString();
                        strength.remove(0, 8);
                        strength.remove(strength.length() - 2, 2);
                        QString fengli = today_weather.value("fengxiang").toString() + strength;
                        ui->label_weather_2->setText(weather_type);    //显示天气类型
                        ui->label_temperature_2->setText(wendu);
                        ui->label_wind_2->setText(fengli);
                        ui->label_recommend_2->setText(tuijian);
                    }
                }
            }
        }
    }
    else
        ui->label_recommend_2->setText( "json_recv is NULL or is not a object !");
    reply->deleteLater(); //销毁请求对象
}

2 天气JSON格式数据

{
	"data":
	{
		"yesterday":
		{
			"date":"21日星期日",
			"high":"高温 26℃",
			"fx":"南风",
			"low":"低温 16℃",
			"fl":"<![CDATA[2级]]>",
			"type":"多云"
		},
		"city":"广州",
		"forecast":[
		{
			"date":"22日星期一",
			"high":"高温 28℃",
			"fengli":"<![CDATA[2级]]>",
			"low":"低温 14℃",
			"fengxiang":"南风",
			"type":"多云"
		},
		{
			"date":"23日星期二",
			"high":"高温 29℃",
			"fengli":"<![CDATA[2级]]>",
			"low":"低温 16℃",
			"fengxiang":"东南风",
			"type":"多云"
		},
		{
			"date":"24日星期三",
			"high":"高温 28℃",
			"fengli":"<![CDATA[3级]]>",
			"low":"低温 17℃",
			"fengxiang":"南风",
			"type":"多云"
		},
		{
			"date":"25日星期四",
			"high":"高温 26℃",
			"fengli":"<![CDATA[2级]]>",
			"low":"低温 18℃",
			"fengxiang":"东南风",
			"type":"小雨"
		},
		{
			"date":"26日星期五",
			"high":"高温 25℃",
			"fengli":"<![CDATA[3级]]>",
			"low":"低温 18℃",
			"fengxiang":"东北风",
			"type":"小雨"
		}],
		"ganmao":"感冒易发期,外出请适当调整衣物,注意补充水分。",
		"wendu":"18"
	},
	"status":1000,
	"desc":"OK"
}

3 demo代码

ui文件
随意定一下布局如下,右侧控件名需要与代码中对应。
在这里插入图片描述

h文件(mainwindows.h)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "customscroll.h"

#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>

#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

namespace Ui {
class MainWindow;
}


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void replyFinished(QNetworkReply *reply);
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    CustomScroll *tableMove;

    QNetworkAccessManager *manager;  //请求句柄
    void sendQuest(QString cityStr);
};

#endif // MAINWINDOW_H

cpp文件(mainwindows.cpp)

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStandardItemModel>
#include <QScrollBar>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QStringList cityList = QString("广州,北京,上海,深圳").split(",");
    ui->comboBox->addItems(cityList);
    manager = new QNetworkAccessManager(this);  //新建QNetworkAccessManager对象
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//关联信号和槽
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()//点击查询请求天气数据
{
    QString local_city = ui->comboBox->currentText().trimmed(); //获得需要查询天气的城市名称
    sendQuest(local_city);
}

void MainWindow::sendQuest(QString cityStr)
{
    char quest_array[256] = "http://wthrcdn.etouch.cn/weather_mini?city=";
    QNetworkRequest quest;
    sprintf(quest_array, "%s%s", quest_array, cityStr.toUtf8().data());
    quest.setUrl(QUrl(quest_array));
    quest.setHeader(QNetworkRequest::UserAgentHeader, "RT-Thread ART");
    manager->get(quest);    /*发送get网络请求*/
}

void MainWindow::replyFinished(QNetworkReply *reply)  //天气数据处理槽函数
{
    QString all = reply->readAll();
    ui->textBrowser->setText(all); //将接收到的数据显示出来

    QJsonParseError err;
    QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(), &err);//解析json对象
    qDebug() << "recv weather data! error:"<< err.error;

    if (!json_recv.isNull())
    {
        QJsonObject object = json_recv.object();
        if (object.contains("data"))
        {
            QJsonValue value = object.value("data");  // 获取指定 key 对应的 value
            if (value.isObject())
            {
                QJsonObject object_data = value.toObject();
                if (object_data.contains("forecast"))
                {
                    QJsonValue value = object_data.value("forecast");

                    if (value.isArray())
                    {
                        QJsonObject today_weather = value.toArray().at(0).toObject();

                        QString weather_type = today_weather.value("type").toString();
                        QString tuijian = object.value("data").toObject().value("ganmao").toString();
                        QString low = today_weather.value("low").toString();
                        QString high = today_weather.value("high").toString();
                        QString wendu = low.mid(low.length() - 4, 4) + "~" + high.mid(high.length() - 4, 4);
                        QString strength = today_weather.value("fengli").toString();
                        strength.remove(0, 8);
                        strength.remove(strength.length() - 2, 2);
                        QString fengli = today_weather.value("fengxiang").toString() + strength;
                        ui->label_weather_2->setText(weather_type);    //显示天气类型
                        ui->label_temperature_2->setText(wendu);
                        ui->label_wind_2->setText(fengli);
                        ui->label_recommend_2->setText(tuijian);
                    }
                }
            }
        }
    }
    else
        ui->label_recommend_2->setText( "json_recv is NULL or is not a object !");
    reply->deleteLater(); //销毁请求对象
}


4 最终效果

在这里插入图片描述
目前只是获取信息,做最基本的信息显示,需要的话可以将信息统计显示,或者如下图所示,可以把界面做的更漂亮一些。在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt获取天气代码 的相关文章

  • 201609-3 炉石传说

    201609 3 炉石传说 题意描述 本题要求我们去模拟一款游戏的运行 xff0c 游戏分为双方 轮流操作 操作共有三种形式 summon attack end 输入输出格式 输入 n 接下来是 n 个操作 每个操作由字符串区分 后面是操作
  • 超详细Windows10/Windows11 子系统(WSL2)安装Ubuntu20.04(带桌面环境)+CUDA11.3+pytorch1.8.1+pycharm

    超详细Windows10 Windows11 子系统 xff08 WSL2 xff09 安装Ubuntu20 04 xff08 带桌面环境 xff09 user zhaowei的博客 CSDN博客 wsl 桌面环境 目录前言在Windows
  • 洛谷_P1825 [USACO11OPEN]Corn Maze S(尚贤)

    题目 xff1a https www luogu com cn problem P1825 span class token macro property span class token directive keyword include
  • 从知名软件提取出的神器,吊打一众付费

    前言 现在的软件功能虽然越更新越多 xff0c 但也是越来越臃肿了 xff0c 不仅占内存 启动慢 xff0c 老更新也怪麻烦的 你们应该也有过因为某个小功能挺好用而不忍心卸载整款软件的情况吧 今天给大家分享几款从知名软件中提取出来的小工具
  • Ubuntu 设置网络代理的一些配置

    因公司需求 xff0c 连接网络必须使用代理设置连接网络 xff0c 这里给大家分享一下我的配置步骤 xff01 如果以下这些不符合你的需求 xff1a 来看这个 xff1a ubuntu 内网搭建服务器的一些配置 xff0c 完美解决ht
  • Linux上git+gitee的基本使用

    目录 1 git 2 gitee 3 本地仓库建立和git基本使用 1 远程仓库同步到本地仓库 xff1a 2 提交本地仓库到远程仓库进行更新 如在本地代码仓库中新建了test1 txt和test2 txt文件或者对文件内容进行了修改 xf
  • java编程题练习2

    程序6 题目 xff1a 输入两个正整数m和n xff0c 求其最大公约数和最小公倍数 在循环中 xff0c 只要除数不等于0 xff0c 用较大数除以较小的数 xff0c 将小的一个数作为下一轮循环的大数 xff0c 取得的余数作为下一轮
  • 安装Anaconda后,cmd输入python没有结果

    可能是电脑上已经安装过python xff0c 在cmd中输入 where python 查看电脑上所有python解释器所在的路径 路径优先级最高的解释器 xff08 非Anaconda所在路径 xff09 出现损坏 xff0c 或由于其
  • 用python发送163邮件

    邮件是最早有用计算机通信的方式之一 xff0c 采用pop3协议接受邮件 xff0c smtp协议发送邮件 xff0c 基本上所有的计算机通信建立在tcp udp协议之上 xff0c 邮件传输协议也是不列外的 如果想要用编程语言发送邮件 x
  • 【AWS EC2】云端简单部署NodeJS应用

    根据需要启动想要的EC2 注意 xff1a 选择Linux时用x86而不是arm xff0c 不然kafka和zookeeper启动不了 xff08 在我的项目里 xff09 并且bitnami zookeeper latest需要内存超过
  • 在kali linux上安装git与push提交

    在kali linux上安装git与push提交 写在前面 xff1a 最好不要在root账户下创建 xff0c 在使用vscode时会带来好多问题 1 安装git apt get install git 2 添加git服务用户 邮箱 xf
  • 判断一颗二叉树是否为完全二叉树

    package main import 34 container list 34 思路 层序遍历 只需分两种情况 1 xff09 若当前节点左孩子为空右孩子不为空 直接返回不空 2 xff09 若当前节点的左右孩子不全 则其后面的节点必须都
  • 【mybatis-plus】mybatis-plus代码生成器,自动生成controller、service、dao、mapper、pojo代码,可灵活配置生成路径,程序猿的福音!!!

    在我们需要一些数据库的实体类时 xff0c 需要手动创建实体与类 xff0c 这很浪费时间 xff0c 所以我研究了一下和上网找了一些资料 xff0c 整合出了一套可灵活配置生成路径的代码 xff01 xff01 xff01 直接上代码 s
  • python爬虫:爬取携程航班数据

    python爬虫 xff1a 爬取携程航班数据 最近在学爬虫 xff0c 用携程的航班数据练手 xff0c 顺便记录一下 xff0c 话不多说下面开始 xff1a 一 首先来观察一下携程网的航班信息的网页 xff1a 这是一个携程网站的截图
  • PyQt5入门和常用模块(含多线程简单例子)

    1 安装软件包 pip span class token function install span PyQt5 pip span class token function install span pyqt5 tools 2 安装Qtde
  • CentOS 8.5高性能计算开发环境配置备忘

    CentOS 8 5环境配置 在CentOS 8 5系统下配置高性能计算环境 主要包含编译器套件 分布式并行套件 各种数值计算库 Python环境 辅助管理工具 GPU开发环境等 利用CentOS自带的RPM仓库 xff0c 加上OpenH
  • Python3 + BeautifulSoup 爬取Steam热销商品数据

    这次用了BeautifulSoup库来爬取Steam的热销商品 xff0c BeautifulSoup更侧重的是从页面的结构解析 xff0c 根据标签元素等来爬取数据 xff0c 这次遇到两个问题 xff1a 1 Steam热销商品列表经常
  • C语言中用%输出不同内容

    C语言有很多输出函数 xff0c 也有很多输出方式 xff0c 但最基础的还是printf 函数 xff0c 但我们不止能输出想要的内容还能指定输出的方式 xff0c 下面我就对此总结一下 xff0c 本人也是初学者 xff0c 以下内容可
  • 了解script setup语法糖

    了解 lt script setup gt 语法糖 基本语法 lt script setup lang 61 34 ts 34 gt console log 39 hello script setup 39 lt script gt 里面的

随机推荐

  • vscode中修改/重置gitlab远程仓库地址(3种方式)

    vscode中修改 重置gitlab远程仓库地址 方法1 xff1a 更换git远程仓库地址 1 查看当前remotes git remote v 2 修改remotes git remote set url origin https gi
  • Java中时间戳转换日期

    String value 61 34 79898768 34 时间戳 String date 61 stampToDate value 时间戳转换日期 时间戳转换日期方法 public static String stampToDate S
  • SAP-PI/PO ICO中增加过滤条件

  • 今日头条笔试之手串问题

    一 问题描述 题目摘自牛客网 xff0c 可以到牛客网直接查找 xff0c 现直接贴上原题目描述 作为一个手串艺人 xff0c 有金主向你订购了一条包含n个杂色串珠的手串 每个串珠要么无色 xff0c 要么涂了若干种颜色 为了使手串的色彩看
  • VS2015对WDK10驱动程序进行双机调试

    1 设置Visual Studio 2015调试方式 xff1a 主计算机 xff1a WIN7 64位 虚拟机 xff1a WIN7 64位 调试器 xff1a VS2015 调试的软件 xff1a 内核驱动程序 一 主计算机和虚拟机两台
  • Node.js下载及安装步骤

    一 安装环境 1 本机系统 xff1a Windows 11 xff08 64位 xff09 2 Node js xff1a v16 14 2LTS xff08 64位 xff09 二 安装Node js步骤 1 下载对应系统的Node j
  • IDEA中设置默认Maven配置

    一 每次打开项目时修改maven配置 xff08 默认的maven地址可能不是我们想要的 xff0c 可以通过下面方法修改 xff09 二 配置默认的地址 第一种方法太麻烦 xff0c 每次打开项目都需要配置maven xff0c 我们可以
  • sql server 2014下载及安装步骤—图解

    注意 xff1a 1 Win10之后的系统 xff0c 在安装之前需要安装 net framework 3 5 sp1 xff0c 以免后续安装报错 2 Express版本为缩减版 xff0c 无SSMS xff0c 需自行下载 xff0c
  • win11安装IIS步骤—图解

    1 使用快捷键win 43 r 输入control 打开控制面板 xff0c 然后点击程序 xff0c 选择启用或关闭Windows功能 xff0c 勾选Internet Information Services 默认安装IIS 2 通过
  • SqlServer怎么计算两个日期之差,精确到毫秒计算

    DateTime xff1a 字段类型对应的时间格式是 yyyy MM dd HH mm ss fff xff0c 3个f xff0c 精确到1毫秒 ms xff0c 示例 2023 01 07 10 06 15 433 DateTime2
  • 直接在浏览器中访问程序无问题,在IIS中点击浏览网站无反应

    问题 xff1a 直接在浏览器中访问程序无问题 xff0c 在IIS中点击浏览网站无反应 解决方案 xff1a 在设置中点击应用后设置默认的浏览器
  • 在IIS中发布NetCore程序

    需安装的软件 xff0c 如下图所示 软件下载地址 xff1a https dotnet microsoft com en us download dotnet 注意 xff1a 发布的程序版本必须和本地安装的一致 xff0c 否则会报错
  • PotPlayer优化与最高画质设置(最强本地播放器)

    一 前言 软件 xff1a PotPlayer 描述 xff1a 被誉为本地视频最好用的播放器 xff01 PotPlayer下载地址参考 xff1a https potplayer org 推荐Potplayer论坛 xff1a http
  • 基于51单片机定时器计数+74HC595移位寄存器+8位数码管时钟

    基于51单片机 74HC595移位寄存器 8位数码管时钟 Proteus仿真 实例代码 span class token macro property span class token directive hash span span cl
  • 51单片机外部中断使用示例程序

    51单片机外部中断使用示例程序 本实例来源以STC89演示示例 xff0c 为了方便初学者更好的阅读 xff0c 直接将其贴出来 首先分享一份 STC单片机资源一览表 你也可以从https www stcisp com 下载到 xff0c
  • 使用kubeadm部署kubernetes集群

    一 安装环境准备 1 安装环境 xff1a centos7 5 xff0c 一个master节点 xff0c 两个node节点 CentOS Linux release 7 5 1804 Core 2 设置 etc hosts文件的IP和主
  • 【Proteus仿真】51单片机自定义倒计时

    Proteus仿真 51单片机自定义倒计时 Proteus仿真 类似一个时间闹铃的一个功能 只不过这是只是一个用来倒计时的 程序源码 span class token comment 实验说明 实验接线 1 动态数码管模块 gt 单片机管脚
  • 微信小程序云开发之数据库操作

    一 初始化 xff1a 在做数据的操作 xff08 增删改查 xff09 之前 xff0c 先要获取数据库的对象 xff0c 可以通过wx cloud database函数来获取到 xff0c 这个函数默认会使用wx cloud init方
  • QT中QTablewidget表格常用操作

    QTabwidget常用操作 0 QTableWidget初始化示例1 列设置 xff08 表头 xff09 1 1 添加表头1 2 设置表头样式 xff08 颜色和字体 xff09 1 3 设置表头宽度1 4 自适应表头宽度1 5 设置表
  • qt获取天气代码

    qt显示天气信息 1 发送网络请求获取天气数据1 1 需要包含的头文件1 2 创建QNetworkAccessManager对象1 3 发送请求1 4 获取数据并解析 2 天气JSON格式数据3 demo代码4 最终效果 1 发送网络请求获