ToB企服应用市场:ToB评测及商务社交产业平台

标题: Qt天气预报系统获取天气数据 [打印本页]

作者: 种地    时间: 2025-1-11 08:23
标题: Qt天气预报系统获取天气数据
1、获取天气数据

1.1添加天气类头文件

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

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

起名为weatherData

1.2定义本日和未来几每天气数据类

  1. //今天的数据类
  2. class Today{
  3. public:
  4.     Today()
  5.     {
  6.         city ="广州";     //城市
  7.         date ="2025-1-10";  //日期
  8.         
  9.         weatherType ="多云";     //天气类型
  10.         highTem = 30;           //最高温
  11.         lowTem = 18;            //最低温
  12.         ganMao ="感冒指数";      //感冒指数
  13.         Temperature = 0;       //温度
  14.         Humidity = "0%";       //湿度
  15.         PM25 = 0;              //PM2.5
  16.         windType ="南风";       //风的类型
  17.         windPower ="2级";       //风力
  18.         airQuality ="无数据";    //空气质量
  19.     }
  20.     QString city;
  21.     QString date;
  22.     int Temperature;
  23.     QString weatherType;
  24.     int highTem;
  25.     int lowTem;
  26.     QString ganMao;
  27.     QString Humidity;
  28.     int PM25;
  29.     QString windType;
  30.     QString windPower;
  31.     QString airQuality;
  32. };
  33. //未来几天的数据类
  34. class Day{
  35. public:
  36.     Day()
  37.     {
  38.         week ="周五";             //星期
  39.         date ="2023-7-29";       //日期
  40.         weatherType ="多云";      //天气类型
  41.         airQuality = 0; //空气指数,优        //空气质量
  42.         highTem = 0;              //最高温
  43.         lowTem = 0;               //最低温
  44.         windType ="南风";          //风的类型
  45.         windPower ="2级";         //风力
  46.     }
  47.     QString week;
  48.     QString date;
  49.     QString weatherType;
  50.     int airQuality;
  51.     int highTem;
  52.     int lowTem;
  53.     QString windType;
  54.     QString windPower;
  55. };
复制代码
1.3定义一个解析JSON数据的函数

  1. void parseJson(QByteArray& byteArray);                  //解析JSON数据
复制代码
1.4在mainwindow中添加weatherData.h

  1. #include "weatherData.h"
复制代码
1.5创建今每天气数据和未来几每天气数据对象

  1. Today today;                                //定义一个今天天气数据对象
  2. Day day[7];                                 //定义未来几天天气数据对象
复制代码
1.6添加parseJson定义


1.7把解析JSON数据添加进去

  1. void MainWindow::readHttpReply(QNetworkReply *reply)
  2. {
  3.     int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();   //状态码
  4.     //请求错误
  5.     if(reply->error() != QNetworkReply::NoError || status_code != 200)
  6.     {
  7.         qDebug() << reply->errorString().toLatin1().data();     //打印错误信息
  8.         QMessageBox::warning(this,"天气","请求数据失败", QMessageBox::Ok);      //弹出警告信息框
  9.     }
  10.     //请求成功
  11.     else
  12.     {
  13.         QByteArray byteArray = reply->readAll();        //读取服务器数据
  14.         qDebug() << "read all:"<< byteArray.data();     //打印接收到的数据
  15.         parseJson(byteArray);                           //解析JSON数据
  16.     }
  17.     reply->deleteLater();       //释放对象
  18. }
复制代码
1.8添加错误

  1. //解析JSON格式天气数据
  2. void MainWindow::parseJson(QByteArray &byteArray)
  3. {
  4.     //错误
  5.     QJsonParseError err;
  6. }
复制代码
鼠标放到QJsonParseError上, ALT+Enter选择添加头文件,背面的也雷同,使用一个

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

1.9解析整个天气数据

  1. //解析JSON格式天气数据
  2. void MainWindow::parseJson(QByteArray &byteArray)
  3. {
  4.     //错误
  5.     QJsonParseError err;        //创建一个错误对象
  6.     QJsonDocument doc = QJsonDocument::fromJson(byteArray, &err);   //将JSON格式解析为QJsonDocument对象
  7.     //如果错误
  8.     if(err.error != QJsonParseError::NoError)
  9.     {
  10.         return;    //返回
  11.     }
  12.    
  13.     QJsonObject rootObj = doc.object();     //创建一个QJsonObject对象返回文档
  14.     //    qDebug() << rootObj.value("message").toString();
  15.    
  16.     //1.解析城市和日期
  17.     today.city = rootObj.value("cityInfo").toObject().value("city").toString();     //城市
  18.     today.date = rootObj.value("date").toString();                                  //日期
  19.    
  20.     //2.解析昨天yesterday数据
  21.     QJsonObject objData = rootObj.value("data").toObject();         //获取data对象
  22.    
  23.     QJsonObject objYesterday = objData.value("yesterday").toObject();          //昨天
  24.     day[0].week = objYesterday.value("week").toString();                       //星期
  25.     day[0].date = objYesterday.value("date").toString();                       //日期
  26.    
  27.     day[0].weatherType = objYesterday.value("type").toString();                      //天气类型
  28.    
  29.     QString highT;          //最高温
  30.     highT = objYesterday.value("high").toString().split(" ").at(1); //空格分割,取分割后第二个数据,1是第二个,0是第一个
  31.     day[0].highTem = highT.left(highT.length() - 1).toInt(); //把℃减掉,只剩数字
  32.     QString lowT;           //最低温
  33.     lowT = objYesterday.value("low").toString().split(" ").at(1);
  34.     day[0].lowTem = lowT.left(lowT.length() - 1).toInt();
  35.    
  36.     //风的类型,风力
  37.     day[0].windType = objYesterday.value("fx").toString();      //风的类型   
  38.     day[0].windPower = objYesterday.value("fl").toString();     //风力
  39.    
  40.     //空气指数
  41.     day[0].airQuality =objYesterday.value("aqi").toDouble();    //空气质量
  42.    
  43.     //3.解析未来几天的天气数据
  44.     QJsonArray forecastArray = objData.value("forecast").toArray();        //获取forecast数组
  45.     //遍历未来几天天气数据
  46.     for(int i=0 ; i<6 ; i++)
  47.     {
  48.         QJsonObject forecastObj = forecastArray[i].toObject();             //获取JSON对象
  49.         
  50.         day[i+1].week = forecastObj.value("week").toString();             //星期
  51.         day[i+1].date = forecastObj.value("ymd").toString();              //日期
  52.         day[i+1].weatherType = forecastObj.value("type").toString();      //天气类型
  53.         //空气指数
  54.         day[i+1].airQuality =forecastObj.value("aqi").toDouble();         //空气质量
  55.         
  56.         
  57.         QString highT;      //最高温
  58.         highT = forecastObj.value("high").toString().split(" ").at(1);      //空格分割,取分割后第二个数据,1是第二个,0是第一个
  59.         day[i+1].highTem = highT.left(highT.length() - 1).toInt();          //把℃减掉,只剩数字
  60.         QString lowS;       //最低温
  61.         lowS = forecastObj.value("low").toString().split(" ").at(1);
  62.         day[i+1].lowTem = lowS.left(lowS.length() - 1).toInt();
  63.         
  64.         //风的类型,风力
  65.         day[i+1].windType = forecastObj.value("fx").toString();           //风的类型
  66.         day[i+1].windPower = forecastObj.value("fl").toString();          //风力
  67.         
  68.         //4、解析今天的数据
  69.         today.Temperature =objData.value("wendu").toInt();                 //温度
  70.         
  71.         today.ganMao =objData.value("ganmao").toString();                  //感冒指数
  72.         
  73.         today.Humidity = objData.value("shidu").toString();                //湿度
  74.         today.PM25 = objData.value("pm25").toDouble();                        //PM2.5
  75.         today.airQuality = objData.value("quality").toString();            //空气质量
  76.         
  77.         //forecast里面也有今天的数据
  78.         today.weatherType = day[1].weatherType;                            //天气类型
  79.         today.highTem = day[1].highTem;                                    //最高温
  80.         today.lowTem = day[1].lowTem;                                      //最低温
  81.         
  82.         today.windType = day[1].windType;                                  //风的类型
  83.         today.windPower = day[1].windPower;                                //风力
  84.         
  85.     }  
  86. }
复制代码
2、.h文件和.cpp文件

2.1 mainwindow.h文件

  1. #ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QMenu>#include <QMessageBox>#include <QNetworkAccessManager>#include <QNetworkReply>#include "weatherData.h"
  2. QT_BEGIN_NAMESPACEnamespace 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数据
  3. 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文件

  1. #ifndef WEATHERDATA_H
  2. #define WEATHERDATA_H
  3. #include <QString>
  4. //今天的数据类
  5. class Today{
  6. public:
  7.     Today()
  8.     {
  9.         city ="广州";     //城市
  10.         date ="2025-1-10";  //日期
  11.         weatherType ="多云";     //天气类型
  12.         highTem = 30;           //最高温
  13.         lowTem = 18;            //最低温
  14.         ganMao ="感冒指数";      //感冒指数
  15.         Temperature = 0;       //温度
  16.         Humidity = "0%";       //湿度
  17.         PM25 = 0;              //PM2.5
  18.         windType ="南风";       //风的类型
  19.         windPower ="2级";       //风力
  20.         airQuality ="无数据";    //空气质量
  21.     }
  22.     QString city;
  23.     QString date;
  24.     int Temperature;
  25.     QString weatherType;
  26.     int highTem;
  27.     int lowTem;
  28.     QString ganMao;
  29.     QString Humidity;
  30.     int PM25;
  31.     QString windType;
  32.     QString windPower;
  33.     QString airQuality;
  34. };
  35. //未来几天的数据类
  36. class Day{
  37. public:
  38.     Day()
  39.     {
  40.         week ="周五";             //星期
  41.         date ="2023-7-29";       //日期
  42.         weatherType ="多云";      //天气类型
  43.         airQuality = 0; //空气指数,优        //空气质量
  44.         highTem = 0;              //最高温
  45.         lowTem = 0;               //最低温
  46.         windType ="南风";          //风的类型
  47.         windPower ="2级";         //风力
  48.     }
  49.     QString week;
  50.     QString date;
  51.     QString weatherType;
  52.     int airQuality;
  53.     int highTem;
  54.     int lowTem;
  55.     QString windType;
  56.     QString windPower;
  57. };
  58. #endif // WEATHERDATA_H
复制代码
2.3 .cpp文件

  1. #include "mainwindow.h"#include "ui_mainwindow.h"#include <QJsonArray>#include <QJsonObject>#include <QJsonParseError>#include <QMouseEvent>#include "weatherData.h"
  2. 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.5        today.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)
  3. {
  4.     int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();   //状态码
  5.     //请求错误
  6.     if(reply->error() != QNetworkReply::NoError || status_code != 200)
  7.     {
  8.         qDebug() << reply->errorString().toLatin1().data();     //打印错误信息
  9.         QMessageBox::warning(this,"天气","请求数据失败", QMessageBox::Ok);      //弹出警告信息框
  10.     }
  11.     //请求成功
  12.     else
  13.     {
  14.         QByteArray byteArray = reply->readAll();        //读取服务器数据
  15.         qDebug() << "read all:"<< byteArray.data();     //打印接收到的数据
  16.         parseJson(byteArray);                           //解析JSON数据
  17.     }
  18.     reply->deleteLater();       //释放对象
  19. }
复制代码

获取天气数据完成!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4