
天气预报可以选择城市搜索近五天的天气暂时无法通过城市编码搜索。参考博客https://blog.csdn.net/m0_57730390/article/details/125751223?spm1001.2014.3001.5502一、ui界面部分二、代码实现部分功能1weather.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_H2weather.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图片 * 解决办法 https://www.cnblogs.com/wxh-53919/p/10071560.html * 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\nstr2); //关联请求完毕信号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 武汉) { num101200101; } if(place北京) { num 101010100; } if(place 广州) { num101280101; } ui-numEdit-setText(num); //代码表补全显示 // 接入网站 QUrl url(http://t.weather.sojson.com/api/weather/city/ num); //创建一个请求对象 QNetworkRequest request(url); //发送获取消息请求,manager完成请求跳转槽函数读取数据 replymanager-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 i1; i5; i) // 修改未来天的时间 { 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()flo.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 i0; i5; 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(aqi150 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(); }三、最终界面