天气预报
可以选择城市搜索近五天的天气,暂时无法通过城市编码搜索。参考博客:https://blog.csdn.net/m0_57730390/article/details/125751223?spm=1001.2014.3001.5502
一、ui界面部分
二、代码实现部分功能
(1)weather.h
#ifndef WEATHER_H
#define WEATHER_H
#include <QMainWindow>
#include <QWidget>
#include <QLabel>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QLocale>
#include <QTime>
#include <QDateTime>
#include <QString>
namespace Ui
{
class Weather;
}
class Weather : public QWidget
{
Q_OBJECT
public:
explicit Weather(QWidget *parent = nullptr);
~Weather();
private slots:
void on_getBt_clicked();
void read_data(QNetworkReply *reply);
void on_weather_exit_clicked();
private:
Ui::Weather *ui;
QNetworkAccessManager *manager;
signals:
void weather_show_main();
};
#endif // WEATHER_H
(2)weather.cpp
#include "weather.h"
#include "ui_weather.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonParseError>
/*
* 小鑫说明
* 会报警告:libpng warning: iCCP: known incorrect sRGB profile,不影响使用,所以并未进行处理
* 产生原因:weatherWidget中所用png图片
* 解决办法:1 https://www.cnblogs.com/wxh-53919/p/10071560.html
* 2 https://blog.csdn.net/qq_37924224/article/details/119181028
*/
Weather::Weather(QWidget *parent) :
QWidget(parent),
ui(new Ui::Weather)
{
ui->setupUi(this);
// 时间显示
QLocale locale = QLocale::Chinese;//指定中文显示
QDateTime datetime = QDateTime::currentDateTime();
QString str1 = datetime.toString("yyyy-MM-dd");
QString str2 = locale.toString(datetime,"dddd");
ui->label_time->setText(str1+"\n"+str2);
//关联请求完毕信号finished(QNetworkReply* )
manager = new QNetworkAccessManager();
QString num = ui->numEdit->text(); // 初始城市为广州
// 接入网站
QUrl url("http://t.weather.sojson.com/api/weather/city/" + num);
//创建一个请求对象
QNetworkRequest request(url);
//发送获取消息请求,manager完成请求跳转槽函数读取数据
reply = manager->get(request);
connect(reply, &QIODevice::readyRead, this, &Weather::read_data);
// connect(manager, &QNetworkAccessManager::finished,this, &Weather::read_data);
}
Weather::~Weather()
{
delete ui;
}
void Weather::on_getBt_clicked()
{
QString place = ui->placeBox->currentText();
QString num;
// 城市气象代码表
if(place=="襄阳")
{
num = "101200201";
}
if(place == "武汉")
{
num="101200101";
}
if(place=="北京")
{
num = "101010100";
}
if(place == "广州")
{
num="101280101";
}
ui->numEdit->setText(num); //代码表补全显示
// 接入网站
QUrl url("http://t.weather.sojson.com/api/weather/city/" + num);
//创建一个请求对象
QNetworkRequest request(url);
//发送获取消息请求,manager完成请求跳转槽函数读取数据
reply=manager->get(request);
connect(reply, &QIODevice::readyRead, this, &Weather::read_data);
}
void Weather::read_data()
{
//QNetworkReply一旦从对象中读取数据,它保留这些数据。
QByteArray array = reply->readAll();//读取所有数据
//json解析
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(array, &error);
//校验格式是否有错
if(error.error != QJsonParseError::NoError)
{
qDebug()<<"json error";
return ;
}
QJsonObject obj = doc.object();
QJsonObject weatherObj = obj.value("data").toObject();
QJsonArray forecast = weatherObj.value("forecast").toArray();
//未来四天
QLabel *week[4];
week[0] = ui->label_week1;
week[1] = ui->label_week1_2;
week[2] = ui->label_week1_3;
week[3] = ui->label_week1_4;
QLabel *date[4];
date[0] = ui->label_date1;
date[1] = ui->label_date2;
date[2] = ui->label_date3;
date[3] = ui->label_date4;
// 修改5天的天气情况
QLabel *hw[5]; // 温度
hw[0] = ui->label_hw;
hw[1] = ui->label_hw1;
hw[2] = ui->label_hw2;
hw[3] = ui->label_hw3;
hw[4] = ui->label_hw4;
QLabel *type[5]; // 天气类型
type[0] = ui->label_type;
type[1] = ui->label_type1;
type[2] = ui->label_type2;
type[3] = ui->label_type3;
type[4] = ui->label_type4;
QLabel *fxfl[5]; // 风力
fxfl[0] = ui->label_fxfl;
fxfl[1] = ui->label_fxfl1;
fxfl[2] = ui->label_fxfl2;
fxfl[3] = ui->label_fxfl3;
fxfl[4] = ui->label_fxfl4;
QLabel *aqi[5]; // 空气质量
aqi[0] = ui->label_aqi;
aqi[1] = ui->label_aqi1;
aqi[2] = ui->label_aqi2;
aqi[3] = ui->label_aqi3;
aqi[4] = ui->label_aqi4;
QLabel *tyim[5]; // 天气图片
tyim[0] = ui->label_im;
tyim[1] = ui->label_im1;
tyim[2] = ui->label_im2;
tyim[3] = ui->label_im3;
tyim[4] = ui->label_im4;
for(int i=1; i<5; i++) // 修改未来4天的时间
{
QJsonObject o = forecast.at(i).toObject();
// qDebug()<<"时间:"<<o.value("ymd").toString();
// qDebug()<<"最高温度:"<<o.value("high").toString();
// qDebug()<<"最低温度:"<<o.value("low").toString();
// qDebug()<<"week:"<<o.value("week").toString();
// qDebug()<<"空气质量"<<o.value("aqi").toInt();
// qDebug()<<"fx:"<<o.value("fx").toString(); // 风向
// qDebug()<<"fl"<<o.value("fl").toString(); // 风力
// qDebug()<<"type:"<<o.value("type").toString();
// qDebug()<<"-----------------------";
week[i-1]->setText(o.value("week").toString());
date[i-1]->setText(o.value("ymd").toString());
}
for(int i=0; i<5; i++)
{
QJsonObject o = forecast.at(i).toObject();
hw[i]->setText(o.value("high").toString().mid(3,2) + "~" + o.value("low").toString().mid(3,2) + "℃");
QString ty = o.value("type").toString();
type[i]->setText(ty);
if(ty.contains("雨"))
{
if(ty.contains("中"))
{
tyim[i]->setStyleSheet("border-image: url(:/images/rain_mid.png);");
}
else if(ty.contains("小"))
{
tyim[i]->setStyleSheet("border-image: url(:/images/rain_s.png);");
}
else
{
tyim[i]->setStyleSheet("border-image: url(:/images/rain_big.png);");
}
}
else if(ty.contains("晴"))
{
tyim[i]->setStyleSheet("border-image: url(:/images/sun.png);");
}
else if(ty.contains("云"))
{
tyim[i]->setStyleSheet("border-image: url(:/images/cloudy1.png);");
}
else if(ty.contains("阴"))
{
tyim[i]->setStyleSheet("border-image: url(:/images/cloudy.png);");
}
else if(ty.contains("雪"))
{
if(ty.contains("中"))
{
tyim[i]->setStyleSheet("border-image: url(:/images/snow_mid.png);");
}
else if(ty.contains("小"))
{
tyim[i]->setStyleSheet("border-image: url(:/images/snow_s.png);");
}
else
{
tyim[i]->setStyleSheet("border-image: url(:/images/snow.png);");
}
}
fxfl[i]->setText(o.value("fx").toString() + o.value("fl").toString());
int aqi1 = o.value("aqi").toInt();
if(aqi1 <50)
{
aqi[i]->setText(QString::number(aqi1) + "优");
}
else if(aqi1>=50 && aqi1< 100)
{
aqi[i]->setText(QString::number(aqi1) + "中");
}
else
{
aqi[i]->setText(QString::number(aqi1) + "差");
}
}
}
void Weather::on_weather_exit_clicked()
{
this->close();
emit weather_show_main();
}
三、最终界面