Qt天气预报系统获取天气数据

embedded/2025/1/14 17:47:35/

Qt天气预报系统获取天气数据

  • 1、获取天气数据
    • 1.1添加天气类头文件
    • 1.2定义今天和未来几天天气数据类
    • 1.3定义一个解析JSON数据的函数
    • 1.4在mainwindow中添加weatherData.h
    • 1.5创建今天天气数据和未来几天天气数据对象
    • 1.6添加parseJson定义
    • 1.7把解析JSON数据添加进去
    • 1.8添加错误
    • 1.9解析整个天气数据
  • 2、.h文件和.cpp文件
    • 2.1 mainwindow.h文件
    • 2.2weatherData.h文件
    • 2.3 .cpp文件

1、获取天气数据

1.1添加天气类头文件

鼠标放到项目上, 右键选择Add New...

在这里插入图片描述

选择C++,选择C++Header File

在这里插入图片描述

起名为weatherData

在这里插入图片描述

1.2定义今天和未来几天天气数据类

//今天的数据类
class Today{
public:Today(){city ="广州";     //城市date ="2025-1-10";  //日期weatherType ="多云";     //天气类型highTem = 30;           //最高温lowTem = 18;            //最低温ganMao ="感冒指数";      //感冒指数Temperature = 0;       //温度Humidity = "0%";       //湿度PM25 = 0;              //PM2.5windType ="南风";       //风的类型windPower ="2级";       //风力airQuality ="无数据";    //空气质量}QString city;QString date;int Temperature;QString weatherType;int highTem;int lowTem;QString ganMao;QString Humidity;int PM25;QString windType;QString windPower;QString airQuality;};//未来几天的数据类
class Day{
public:Day(){week ="周五";             //星期date ="2023-7-29";       //日期weatherType ="多云";      //天气类型airQuality = 0; //空气指数,优        //空气质量highTem = 0;              //最高温lowTem = 0;               //最低温windType ="南风";          //风的类型windPower ="2级";         //风力}QString week;QString date;QString weatherType;int airQuality;int highTem;int lowTem;QString windType;QString windPower;
};

1.3定义一个解析JSON数据的函数

void parseJson(QByteArray& byteArray);                  //解析JSON数据

1.4在mainwindow中添加weatherData.h

#include "weatherData.h"

1.5创建今天天气数据和未来几天天气数据对象

Today today;                                //定义一个今天天气数据对象
Day day[7];                                 //定义未来几天天气数据对象

1.6添加parseJson定义

在这里插入图片描述

1.7把解析JSON数据添加进去

void MainWindow::readHttpReply(QNetworkReply *reply)
{int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();   //状态码//请求错误if(reply->error() != QNetworkReply::NoError || status_code != 200){qDebug() << reply->errorString().toLatin1().data();     //打印错误信息QMessageBox::warning(this,"天气","请求数据失败", QMessageBox::Ok);      //弹出警告信息框}//请求成功else{QByteArray byteArray = reply->readAll();        //读取服务器数据qDebug() << "read all:"<< byteArray.data();     //打印接收到的数据parseJson(byteArray);                           //解析JSON数据}reply->deleteLater();       //释放对象
}

1.8添加错误

//解析JSON格式天气数据
void MainWindow::parseJson(QByteArray &byteArray)
{//错误QJsonParseError err;
}
鼠标放到QJsonParseError上, ALT+Enter选择添加头文件,后面的也类似,使用一个

新类的时候,记得添加头文件

在这里插入图片描述

1.9解析整个天气数据

//解析JSON格式天气数据
void MainWindow::parseJson(QByteArray &byteArray)
{//错误QJsonParseError err;        //创建一个错误对象QJsonDocument doc = QJsonDocument::fromJson(byteArray, &err);   //将JSON格式解析为QJsonDocument对象//如果错误if(err.error != QJsonParseError::NoError){return;    //返回}QJsonObject rootObj = doc.object();     //创建一个QJsonObject对象返回文档//    qDebug() << rootObj.value("message").toString();//1.解析城市和日期today.city = rootObj.value("cityInfo").toObject().value("city").toString();     //城市today.date = rootObj.value("date").toString();                                  //日期//2.解析昨天yesterday数据QJsonObject objData = rootObj.value("data").toObject();         //获取data对象QJsonObject objYesterday = objData.value("yesterday").toObject();          //昨天day[0].week = objYesterday.value("week").toString();                       //星期day[0].date = objYesterday.value("date").toString();                       //日期day[0].weatherType = objYesterday.value("type").toString();                      //天气类型QString highT;          //最高温highT = objYesterday.value("high").toString().split(" ").at(1); //空格分割,取分割后第二个数据,1是第二个,0是第一个day[0].highTem = highT.left(highT.length() - 1).toInt(); //把℃减掉,只剩数字QString lowT;           //最低温lowT = objYesterday.value("low").toString().split(" ").at(1);day[0].lowTem = lowT.left(lowT.length() - 1).toInt();//风的类型,风力day[0].windType = objYesterday.value("fx").toString();      //风的类型   day[0].windPower = objYesterday.value("fl").toString();     //风力//空气指数day[0].airQuality =objYesterday.value("aqi").toDouble();    //空气质量//3.解析未来几天的天气数据QJsonArray forecastArray = objData.value("forecast").toArray();        //获取forecast数组//遍历未来几天天气数据for(int i=0 ; i<6 ; i++){QJsonObject forecastObj = forecastArray[i].toObject();             //获取JSON对象day[i+1].week = forecastObj.value("week").toString();             //星期day[i+1].date = forecastObj.value("ymd").toString();              //日期day[i+1].weatherType = forecastObj.value("type").toString();      //天气类型//空气指数day[i+1].airQuality =forecastObj.value("aqi").toDouble();         //空气质量QString highT;      //最高温highT = forecastObj.value("high").toString().split(" ").at(1);      //空格分割,取分割后第二个数据,1是第二个,0是第一个day[i+1].highTem = highT.left(highT.length() - 1).toInt();          //把℃减掉,只剩数字QString lowS;       //最低温lowS = forecastObj.value("low").toString().split(" ").at(1);day[i+1].lowTem = lowS.left(lowS.length() - 1).toInt();//风的类型,风力day[i+1].windType = forecastObj.value("fx").toString();           //风的类型day[i+1].windPower = forecastObj.value("fl").toString();          //风力//4、解析今天的数据today.Temperature =objData.value("wendu").toInt();                 //温度today.ganMao =objData.value("ganmao").toString();                  //感冒指数today.Humidity = objData.value("shidu").toString();                //湿度today.PM25 = objData.value("pm25").toDouble();                        //PM2.5today.airQuality = objData.value("quality").toString();            //空气质量//forecast里面也有今天的数据today.weatherType = day[1].weatherType;                            //天气类型today.highTem = day[1].highTem;                                    //最高温today.lowTem = day[1].lowTem;                                      //最低温today.windType = day[1].windType;                                  //风的类型today.windPower = day[1].windPower;                                //风力}  
}

2、.h文件和.cpp文件

2.1 mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QMenu>
#include <QMessageBox>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include "weatherData.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();protected:void mousePressEvent(QMouseEvent *event) override;      //重写鼠标点击事件函数void mouseMoveEvent(QMouseEvent *event) override;       //重写鼠标移动事件函数void getWeatherInfo(QString citycode);                  //获取天气数据void parseJson(QByteArray& byteArray);                  //解析JSON数据private slots:void on_pushButton_quit_clicked();          //关闭UI界面void onQuitActTriggered();                  //菜单被点击后的处理public slots:void readHttpReply(QNetworkReply *reply);                       //新建一个网络请求获取的槽函数private:Ui::MainWindow *ui;QMenu *quitMenu;                            //创建一个菜单指针QAction *quitAct;                           //定义一个动作QPoint moffset;                             //窗口移动时,鼠标与窗口左上角的偏移值QNetworkAccessManager *NetAccessManger;        //声明一个网络请求对象bool closePOPWindow();                      //关闭窗口的弹窗Today today;                                //定义一个今天天气数据对象Day day[7];                                 //定义未来几天天气数据对象
};
#endif // MAINWINDOW_H

2.2weatherData.h文件

#ifndef WEATHERDATA_H
#define WEATHERDATA_H
#include <QString>
//今天的数据类
class Today{
public:Today(){city ="广州";     //城市date ="2025-1-10";  //日期weatherType ="多云";     //天气类型highTem = 30;           //最高温lowTem = 18;            //最低温ganMao ="感冒指数";      //感冒指数Temperature = 0;       //温度Humidity = "0%";       //湿度PM25 = 0;              //PM2.5windType ="南风";       //风的类型windPower ="2级";       //风力airQuality ="无数据";    //空气质量}QString city;QString date;int Temperature;QString weatherType;int highTem;int lowTem;QString ganMao;QString Humidity;int PM25;QString windType;QString windPower;QString airQuality;};//未来几天的数据类
class Day{
public:Day(){week ="周五";             //星期date ="2023-7-29";       //日期weatherType ="多云";      //天气类型airQuality = 0; //空气指数,优        //空气质量highTem = 0;              //最高温lowTem = 0;               //最低温windType ="南风";          //风的类型windPower ="2级";         //风力}QString week;QString date;QString weatherType;int airQuality;int highTem;int lowTem;QString windType;QString windPower;
};
#endif // WEATHERDATA_H

2.3 .cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QMouseEvent>
#include "weatherData.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowFlag(Qt::FramelessWindowHint);//    this->setLayout(ui->gridLayoutGlobal);      //让界面随着窗口变幻大小quitMenu = new QMenu(this);         //创建一个QMenu对象quitAct = new QAction(QIcon(":/widget/quit.png"), tr("退出"), this);     //定义一个退出动作quitMenu->addAction(quitAct);       //添加动作//    connect(quitMenu,&QMenu::triggered,this,[=]{//        this->close();//    });         //连接信号与槽connect(quitMenu,&QMenu::triggered,this,&MainWindow::onQuitActTriggered);   //连接菜单被触发的信号与槽NetAccessManger = new QNetworkAccessManager(this);          //实例化一个网络请求对象connect(NetAccessManger,&QNetworkAccessManager::finished,this,&MainWindow::readHttpReply);  //连接网络请求获取的信号与槽//101010100是北京的城市编码getWeatherInfo("101010100");}MainWindow::~MainWindow()
{delete ui;
}//鼠标点击
void MainWindow::mousePressEvent(QMouseEvent *event)
{//如果右键被按下if(event->button() == Qt::RightButton){quitMenu->exec(QCursor::pos());       //在当前鼠标位置显示菜单}//当前鼠标位置 event->globalPos()//当前窗口位置 this->pos()if(event->button() == Qt::LeftButton){moffset = event->globalPos() - this->pos();}
}//鼠标移动
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{this->move(event->globalPos() - moffset);    //移动窗口
}//弹窗
bool MainWindow::closePOPWindow()
{// 创建一个消息框询问用户是否真的要退出QMessageBox mes;mes.setWindowTitle("关闭窗口");//  mes.setWindowFlags(Qt::Drawer);       //把标题栏去掉mes.setIcon(QMessageBox::Warning);    //设置一个警告图片mes.setText("是否关闭窗口?");          //弹窗文本mes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);     //设置两个按钮mes.setWindowIcon(QIcon(":/widget/dog.png")); // 设置窗口图标mes.setButtonText(QMessageBox::Ok, tr("确定"));               //ok改为确认mes.setButtonText(QMessageBox::Cancel, tr("取消"));           //Cancel改为取消// 显示消息框并等待用户交互int result = mes.exec();// 根据用户的选择执行相应的操作if (result == QMessageBox::Ok) {// 用户选择了确定,关闭主窗口this->close();return true;}// 用户选择了取消,不关闭主窗口else{return false;     // 窗口关闭操作失败}
}//右上角退出
void MainWindow::on_pushButton_quit_clicked()
{closePOPWindow();
}//鼠标右键退出
void MainWindow::onQuitActTriggered()
{closePOPWindow();
}//获取天气数据
void MainWindow::getWeatherInfo(QString citycode)
{QUrl url("http://t.weather.itboy.net/api/weather/city/" + citycode);     //天气数据接口和城市编码NetAccessManger->get(QNetworkRequest(url));                    //发送GET请求,获取数据}//解析JSON格式天气数据
void MainWindow::parseJson(QByteArray &byteArray)
{//错误QJsonParseError err;        //创建一个错误对象QJsonDocument doc = QJsonDocument::fromJson(byteArray, &err);   //将JSON格式解析为QJsonDocument对象//如果错误if(err.error != QJsonParseError::NoError){return;    //返回}QJsonObject rootObj = doc.object();     //创建一个QJsonObject对象返回文档//    qDebug() << rootObj.value("message").toString();//1.解析城市和日期today.city = rootObj.value("cityInfo").toObject().value("city").toString();     //城市today.date = rootObj.value("date").toString();                                  //日期//2.解析昨天yesterday数据QJsonObject objData = rootObj.value("data").toObject();         //获取data对象QJsonObject objYesterday = objData.value("yesterday").toObject();          //昨天day[0].week = objYesterday.value("week").toString();                       //星期day[0].date = objYesterday.value("date").toString();                       //日期day[0].weatherType = objYesterday.value("type").toString();                      //天气类型QString highT;          //最高温highT = objYesterday.value("high").toString().split(" ").at(1); //空格分割,取分割后第二个数据,1是第二个,0是第一个day[0].highTem = highT.left(highT.length() - 1).toInt(); //把℃减掉,只剩数字QString lowT;           //最低温lowT = objYesterday.value("low").toString().split(" ").at(1);day[0].lowTem = lowT.left(lowT.length() - 1).toInt();//风的类型,风力day[0].windType = objYesterday.value("fx").toString();      //风的类型day[0].windPower = objYesterday.value("fl").toString();     //风力//空气指数day[0].airQuality =objYesterday.value("aqi").toDouble();    //空气质量//3.解析未来几天的天气数据QJsonArray forecastArray = objData.value("forecast").toArray();        //获取forecast数组//遍历未来几天天气数据for(int i=0 ; i<6 ; i++){QJsonObject forecastObj = forecastArray[i].toObject();             //获取JSON对象day[i+1].week = forecastObj.value("week").toString();             //星期day[i+1].date = forecastObj.value("ymd").toString();              //日期day[i+1].weatherType = forecastObj.value("type").toString();      //天气类型//空气指数day[i+1].airQuality =forecastObj.value("aqi").toDouble();         //空气质量QString highT;      //最高温highT = forecastObj.value("high").toString().split(" ").at(1);      //空格分割,取分割后第二个数据,1是第二个,0是第一个day[i+1].highTem = highT.left(highT.length() - 1).toInt();          //把℃减掉,只剩数字QString lowS;       //最低温lowS = forecastObj.value("low").toString().split(" ").at(1);day[i+1].lowTem = lowS.left(lowS.length() - 1).toInt();//风的类型,风力day[i+1].windType = forecastObj.value("fx").toString();           //风的类型day[i+1].windPower = forecastObj.value("fl").toString();          //风力//4、解析今天的数据today.Temperature =objData.value("wendu").toInt();                 //温度today.ganMao =objData.value("ganmao").toString();                  //感冒指数today.Humidity = objData.value("shidu").toString();                //湿度today.PM25 = objData.value("pm25").toDouble();                        //PM2.5today.airQuality = objData.value("quality").toString();            //空气质量//forecast里面也有今天的数据today.weatherType = day[1].weatherType;                            //天气类型today.highTem = day[1].highTem;                                    //最高温today.lowTem = day[1].lowTem;                                      //最低温today.windType = day[1].windType;                                  //风的类型today.windPower = day[1].windPower;                                //风力}
}//网络请求获取
void MainWindow::readHttpReply(QNetworkReply *reply)
{int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();   //状态码//请求错误if(reply->error() != QNetworkReply::NoError || status_code != 200){qDebug() << reply->errorString().toLatin1().data();     //打印错误信息QMessageBox::warning(this,"天气","请求数据失败", QMessageBox::Ok);      //弹出警告信息框}//请求成功else{QByteArray byteArray = reply->readAll();        //读取服务器数据qDebug() << "read all:"<< byteArray.data();     //打印接收到的数据parseJson(byteArray);                           //解析JSON数据}reply->deleteLater();       //释放对象
}

获取天气数据完成!

http://www.ppmy.cn/embedded/153896.html

相关文章

maven 项目怎么指定打包后名字

在 Spring Boot 的 Maven 项目中&#xff0c;你可以通过配置 pom.xml 文件来指定打包后的文件名。具体步骤如下&#xff1a; 打开 pom.xml 文件&#xff1a;找到你的项目根目录下的 pom.xml 文件。 配置 finalName 属性&#xff1a;在 标签下&#xff0c;添加 属性来指定打包后…

系统看门狗配置--以ubuntu为例

linux系统配置看门狗 以 ubuntu 系统配置看门狗为例 配置看门狗使用的脚本文件&#xff0c;需要使用管理员权限来执行&#xff1a; 配置是&#xff1a;系统每 30S 喂一次狗&#xff0c;超过 60S 不进行投喂&#xff0c;就会自动重启。 1. 系统脚本内容&#xff1a; #!/bin/b…

Java基础面试题day02——数据类型

1.八种基本的数据类型&#xff1f; Java支持的数据类型分为两类&#xff1a;基本数据类型和引用数据类型 基本数据类型&#xff1a; 数值型&#xff1a;整数类型byte、short、int、long 浮点类型float、double字符型&#xff1a;char布尔型&#xff1a;boolean 2.long和int…

笔记本电脑 选购 回收 特权模式使用 指南

笔记本电脑 factor 无线网卡&#xff1a;有些笔记本无法检测到特定频段的信息&#xff0c;会导致连不上校园网 sudo iwlist wlp2s0 scan | grep Frequency > net.txt cat net.txt>表示用终端输出覆盖后续文件&#xff0c;>>表示添加到后续文件的末尾 一种更简…

机器学习 - 如何理解几何学中的超平面 ?

线性回归公式 ywTxb 是数据建模中的基础&#xff1a; 数学上&#xff0c;它是一个线性函数。几何上&#xff0c;它是一个超平面。 那么如何理解超平面这个概念呢&#xff1f; 超平面&#xff08;hyperplane&#xff09;是几何学中的一个基本概念&#xff0c;尤其在高维空间和…

Qt的.pro文件中宏的作用

Qt的.pro文件中宏的作用 今天在学习别人的Qt项目时&#xff0c;看到.pro Qt的项目文件中几个宏的定义不知道是什么意思&#xff0c;于是就想着记录下来以备后面复习。 1.greaterThan(QT_MAJOR_VERSION, 5): QT core5compat&#xff1a; 1.1 作用 版本判断与模块添加&#…

MySQL解压版(保姆级教程)

文章目录 1. 下载MySQL2. 解压压缩包3. 添加环境变量4. 创建配置文件5. 启动管理员模式下的CMD6. 重启mysql7. 检查服务是否成功启动8. 可能遇见的错误&#x1f3af; 数据目录未正确初始化&#x1f3af; MySQL服务已存在但路径错误&#x1f3af; 端口被占用&#x1f3af; MySQL…

慧集通(DataLinkX)iPaaS集成平台-系统管理之UI库管理、流程模板

UI库管理 UI库管理分为平台级和自建两种&#xff0c;其中平台级就是慧集通平台自己内置的一些ui库所有客户均可调用&#xff0c;自建则是平台支持使用者自己根据规则自己新增对应的UI库。具体界面如下&#xff1a; 自建UI库新增界面&#xff1a; 注&#xff1a;平台级UI库不支…