智能车载系统#天气预报

天气预报

可以选择城市搜索近五天的天气,暂时无法通过城市编码搜索。参考博客: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();
}

三、最终界面

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值