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添加天气类头文件
1.2定义今天和未来几天天气数据类
class Today{
public:
Today()
{
city ="广州";
date ="2025-1-10";
weatherType ="多云";
highTem = 30;
lowTem = 18;
ganMao ="感冒指数";
Temperature = 0;
Humidity = "0%";
PM25 = 0;
windType ="南风";
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);
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);
}
reply->deleteLater();
}
1.8添加错误
void MainWindow::parseJson(QByteArray &byteArray)
{
QJsonParseError err;
}
鼠标放到QJsonParseError上, ALT+Enter选择添加头文件,后面的也类似,使用一个
新类的时候,记得添加头文件 |
1.9解析整个天气数据
void MainWindow::parseJson(QByteArray &byteArray)
{
QJsonParseError err;
QJsonDocument doc = QJsonDocument::fromJson(byteArray, &err);
if(err.error != QJsonParseError::NoError)
{
return;
}
QJsonObject rootObj = doc.object();
today.city = rootObj.value("cityInfo").toObject().value("city").toString();
today.date = rootObj.value("date").toString();
QJsonObject objData = rootObj.value("data").toObject();
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);
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();
QJsonArray forecastArray = objData.value("forecast").toArray();
for(int i=0 ; i<6 ; i++)
{
QJsonObject forecastObj = forecastArray[i].toObject();
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);
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();
today.Temperature =objData.value("wendu").toInt();
today.ganMao =objData.value("ganmao").toString();
today.Humidity = objData.value("shidu").toString();
today.PM25 = objData.value("pm25").toDouble();
today.airQuality = objData.value("quality").toString();
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_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void getWeatherInfo(QString citycode);
void parseJson(QByteArray& byteArray);
private slots:
void on_pushButton_quit_clicked();
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
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;
windType ="南风";
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
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);
quitMenu = new QMenu(this);
quitAct = new QAction(QIcon(":/widget/quit.png"), tr("退出"), this);
quitMenu->addAction(quitAct);
connect(quitMenu,&QMenu::triggered,this,&MainWindow::onQuitActTriggered);
NetAccessManger = new QNetworkAccessManager(this);
connect(NetAccessManger,&QNetworkAccessManager::finished,this,&MainWindow::readHttpReply);
getWeatherInfo("101010100");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::RightButton)
{
quitMenu->exec(QCursor::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.setIcon(QMessageBox::Warning);
mes.setText("是否关闭窗口?");
mes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
mes.setWindowIcon(QIcon(":/widget/dog.png"));
mes.setButtonText(QMessageBox::Ok, tr("确定"));
mes.setButtonText(QMessageBox::Cancel, tr("取消"));
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));
}
void MainWindow::parseJson(QByteArray &byteArray)
{
QJsonParseError err;
QJsonDocument doc = QJsonDocument::fromJson(byteArray, &err);
if(err.error != QJsonParseError::NoError)
{
return;
}
QJsonObject rootObj = doc.object();
today.city = rootObj.value("cityInfo").toObject().value("city").toString();
today.date = rootObj.value("date").toString();
QJsonObject objData = rootObj.value("data").toObject();
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);
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();
QJsonArray forecastArray = objData.value("forecast").toArray();
for(int i=0 ; i<6 ; i++)
{
QJsonObject forecastObj = forecastArray[i].toObject();
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);
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();
today.Temperature =objData.value("wendu").toInt();
today.ganMao =objData.value("ganmao").toString();
today.Humidity = objData.value("shidu").toString();
today.PM25 = objData.value("pm25").toDouble();
today.airQuality = objData.value("quality").toString();
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);
}
reply->deleteLater();
}
获取天气数据完成!