Qt项目天气预报(7) - 更新一周天气(数据和图像)

 

更新七天JSON信息

调用API :

 专业七日天气v9:/ /同前文需要先 易客云天气API免费天气API接口|天气预报接口|全球天气API接口|气象预警|空气质量 (tianqiapi.com)注册生成自己的api
http://v1.yiketianqi.com/api?unescape=1&version=v9&appid=65521391&appsecret=Dv2eKMLL

解析到的json数据如下: 


对应json数据的键值对匹配不一样,需要重新解析


更新今天信息
Day day[7];
=================================

重写解析函数 - parseWeatherJsonDataNew

//七天json的数据解析
void Widget::parseWeatherJsonDataNew(QByteArray rawData)
{
    QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);
    if(!jsonDoc.isNull() && jsonDoc.isObject()){
     QJsonObject jsonRoot = jsonDoc.object();
     //解析城市
     day[0].mCity = jsonRoot["city"].toString();
     day[0].mPm25 = jsonRoot["aqi"].toObject()["pm25"].toString();
     if(jsonRoot.contains("data") && jsonRoot["data"].isArray()){
       QJsonArray weaArray =jsonRoot["data"].toArray();
       for(int i=0;i<weaArray.size();++i){ //输出七天情况
        QJsonObject obj = weaArray[i].toObject();
        qDebug()<<obj["date"].toString()<<obj["wea"].toString();
        // 将解析到这七年每天的数据解析到我们的数组中
        day[i].mDate = obj["date"].toString();
        day[i].mWeek = obj["week"].toString();
        day[i].mWeathType = obj["wea"].toString();
        day[i].mTemp = obj["tem"].toString();
        day[i].mTempLow = obj["tem2"].toString();
        day[i].mTempHigh = obj["tem1"].toString();
        day[i].mFx = obj["win"].toArray()[0].toString();
        day[i].mFl = obj["win_speed"].toString();
        day[i].mAirq = obj["air_level"].toString();
        day[i].mTips = obj["air_tips"].toString();
        day[i].mHu = obj["humidity"].toString();
       }
     }
    }
// 定义一个函数去给 ui更新数据
    updateUI();

}

更新解析到的ui信息 - updateUI

// 更新ui界面上的信息
void Widget::updateUI()
{
    //解析我们获得的json数据, 填入到相关 控件中

    //解析日期

    ui->labelCurrentData->setText(day[0].mDate + " " + day[0].mWeek); // 把读取到的日期和星期加入到右上角的控件  labelCurrentData 中

    //解析城市名称

    ui->labelCity->setText(day[0].mCity+"市");

    //解析当前温度
    ui->labelTemp->setText(day[0].mTemp+"℃"); // 显示当前温度
    ui->labelTempRange->setText(day[0].mTempLow + "~" +day[0].mTempHigh +"℃"); // 显示温度范围

    //解析天气类型
    ui->labelWeatherType->setText(day[0].mWeathType);
    ui->labelWeatherIcon->setPixmap(mTypeMap[day[0].mWeathType]); // 根据键值对匹配对应图片

    //解析感冒指数
    ui->labelGanMao->setText(day[0].mTips);


    //解析风向
    ui->labelFengXiang->setText(day[0].mFx); //风向
    ui->labelFengXiangData->setText(day[0].mFl);//风力

    //解析PM2.5
    ui->labelPM25Data ->setText(day[0].mPm25);
    //湿度
    ui->labelShiDuData->setText(day[0].mHu);
    //空气质量
    ui->labelAriData->setText(day[0].mAirq);
}


=====================================================

七个数据存放:

自定义Day类来存放每天信息

day.h

#ifndef DAY_H
#define DAY_H

#include <QString>



class Day
{
public:
    Day();

QString mDate;
QString mWeek;
QString mCity;
QString mTemp;
QString mWeathType;
QString mTempLow;
QString mTempHigh;

QString mTips;
QString mFx;
QString mFl;
QString mPm25;
QString mHu;
QString mAirq;

};

#endif // DAY_H

// 没有实现什么方法,day.cpp没有额外内容就不展示

七个列表存放七个控件的信息

   Day day[7];
    // 定义7个列表去存放我们的label控件内容

    QList<QLabel *> mWeekList;
    QList<QLabel *> mDateList;
    QList<QLabel *> mIconList;
    QList<QLabel *> mWeatypeList;
    QList<QLabel *> mAirqList;
    QList<QLabel *> mFxList;
    QList<QLabel *> mFlList;

上方列表依次对应下图中的七个控件


    构造函数中初始化七天数据列表


    mWeekList<<ui->labelday1<<ui->labelday2
             <<ui->labelday3<<ui->labelday4
             <<ui->labelday5<<ui->labelday6;

    mDateList<<ui->labelDate1<<ui->labelDate2
             <<ui->labelDate3<<ui->labelDate4
             <<ui->labelDate5<<ui->labelDate6;

   mIconList<<ui->labelWeahterIcon0<<ui->labelWeahterIcon1
            <<ui->labelWeahterIcon2<<ui->labelWeahterIcon3
            <<ui->labelWeahterIcon4<<ui->labelWeahterIcon5;

  mWeatypeList<<ui->labelWeatherTypeDate0<<ui->labelWeatherTypeDate1
              <<ui->labelWeatherTypeDate2<<ui->labelWeatherTypeDate3
              <<ui->labelWeatherTypeDate4<<ui->labelWeatherTypeDate5;

 mAirqList<<ui->labelairq0<<ui->labelairq1
          <<ui->labelairq2<<ui->labelairq3
          <<ui->labelairq4<<ui->labelairq5;

 mFxList<<ui->labelFX0<<ui->labelFX1
        <<ui->labelFX2<<ui->labelFX3
        <<ui->labelFX4<<ui->labelFX5;

 mFlList<<ui->labelFL0<<ui->labelFL1
        <<ui->labelFL2<<ui->labelFL3
        <<ui->labelFL4<<ui->labelFL5;

调优

调优包括: 

优化pixmap显示

指定 控件大小使其不能因为插入图片而改变

     // 缩放图标的大小让他能够匹配上

     int index =day[i].mWeathType.indexOf("转"); //包含'转'的天气
     if(index != -1){//包含'转'
            pixmap  = mTypeMap[day[i].mWeathType.left(index)]; // 拿到'转'左边的天气图片,例:晴转多云,拿到晴
     }
     else{
     pixmap  = mTypeMap[day[i].mWeathType];
     }
     pixmap  = pixmap.scaled(mIconList[i]->size(),Qt::KeepAspectRatio); //缩放图标的大小为图片大小,并用KeepAspectRatio 参数,不让图片被拉伸

     mIconList[i]->setPixmap(pixmap);

根据空气质量设置样式表

     // 根据空气质量情况设置对应的颜色
     QString  airQ = day[i].mAirq;
     mAirqList[i]->setText(airQ);
     //设置对应样式表
     if(airQ == "优"){
      mAirqList[i]->setStyleSheet(
              "color: rgb(230, 230, 230); background-color: rgb(130, 213, 32); border-radius: 7px");
     }
     if(airQ == "良"){
      mAirqList[i]->setStyleSheet(
              "color: rgb(230, 230, 230); background-color: rgb(255, 187, 69); border-radius: 7px");
     }
     if(airQ == "轻度污染"){
      mAirqList[i]->setStyleSheet(
              "color: rgb(230, 230, 230);background-color: rgb(239, 121, 24);border-radius: 7px");
     }
     if(airQ == "中度污染"){
      mAirqList[i]->setStyleSheet(
              "color: rgb(230, 230, 230); background-color: rgb(255, 17, 17); border-radius: 7px");
     }
     if(airQ == "重度污染"){
      mAirqList[i]->setStyleSheet(
              "color: rgb(230, 230, 230); background-color: rgb(153, 0, 0); border-radius: 7px");
     }

含'转'无法解析的优化

// 以下案例中都涉及 "转"导致无法解析,我们可以调用indexof - 把内容用“转”分开

在匹配上 left(index),将“转”之前的内容解析

     int index =day[i].mWeathType.indexOf("转"); //包含'转'的天气
     if(index != -1){//包含'转'
            pixmap  = mTypeMap[day[i].mWeathType.left(index)]; // 拿到'转'左边的天气图片,例:晴转多云,拿到晴
     }
     else{
     pixmap  = mTypeMap[day[i].mWeathType];
     }
     // 风力也会涉及"转",我们设置为左边的即可
     index = day[i].mFl.indexOf("转");
     if(index != -1){
     mFlList[i]->setText(day[i].mFl.left(index));
     }
     else{
     mFlList[i]->setText(day[i].mFl);
     }

更新updateUI

// 更新ui界面上的信息
void Widget::updateUI()
{
    //解析我们获得的json数据, 填入到相关 控件中

    QPixmap pixmap;

    //解析日期

    ui->labelCurrentData->setText(day[0].mDate + " " + day[0].mWeek); // 把读取到的日期和星期加入到右上角的控件  labelCurrentData 中

    //解析城市名称

    ui->labelCity->setText(day[0].mCity+"市");

    //解析当前温度
    ui->labelTemp->setText(day[0].mTemp+"℃"); // 显示当前温度
    ui->labelTempRange->setText(day[0].mTempLow + "~" +day[0].mTempHigh +"℃"); // 显示温度范围

    //解析天气类型
    ui->labelWeatherType->setText(day[0].mWeathType);
    ui->labelWeatherIcon->setPixmap(mTypeMap[day[0].mWeathType]); // 根据键值对匹配对应图片

    //解析感冒指数
    ui->labelGanMao->setText(day[0].mTips);


    //解析风向
    ui->labelFengXiang->setText(day[0].mFx); //风向
    ui->labelFengXiangData->setText(day[0].mFl);//风力

    //解析PM2.5
    ui->labelPM25Data ->setText(day[0].mPm25);
    //湿度
    ui->labelShiDuData->setText(day[0].mHu);
    //空气质量
    ui->labelAriData->setText(day[0].mAirq);
    // 更新七个QList的数据
    for(int i=0;i<6;++i){
     mWeekList[i]->setText(day[i].mWeek);


     QStringList   daylist  = day[i].mDate.split('-'); //分割字符串 -
     mDateList[i]->setText(daylist.at(1) + "-" + daylist.at(2)); // 原本是2024-6-24 ,我们只要后两位

     // 缩放图标的大小让他能够匹配上

     int index =day[i].mWeathType.indexOf("转"); //包含'转'的天气
     if(index != -1){//包含'转'
            pixmap  = mTypeMap[day[i].mWeathType.left(index)]; // 拿到'转'左边的天气图片,例:晴转多云,拿到晴
     }
     else{
     pixmap  = mTypeMap[day[i].mWeathType];
     }
     pixmap  = pixmap.scaled(mIconList[i]->size(),Qt::KeepAspectRatio); //缩放图标的大小为图片大小,并用KeepAspectRatio 参数,不让图片被拉伸

     mIconList[i]->setPixmap(pixmap);
     mWeatypeList[i]->setText(day[i].mWeathType);
     // 根据空气质量情况设置对应的颜色
     QString  airQ = day[i].mAirq;
     mAirqList[i]->setText(airQ);
     //设置对应样式表
     if(airQ == "优"){
      mAirqList[i]->setStyleSheet(
              "color: rgb(230, 230, 230); background-color: rgb(130, 213, 32); border-radius: 7px");
     }
     if(airQ == "良"){
      mAirqList[i]->setStyleSheet(
              "color: rgb(230, 230, 230); background-color: rgb(255, 187, 69); border-radius: 7px");
     }
     if(airQ == "轻度污染"){
      mAirqList[i]->setStyleSheet(
              "color: rgb(230, 230, 230);background-color: rgb(239, 121, 24);border-radius: 7px");
     }
     if(airQ == "中度污染"){
      mAirqList[i]->setStyleSheet(
              "color: rgb(230, 230, 230); background-color: rgb(255, 17, 17); border-radius: 7px");
     }
     if(airQ == "重度污染"){
      mAirqList[i]->setStyleSheet(
              "color: rgb(230, 230, 230); background-color: rgb(153, 0, 0); border-radius: 7px");
     }



     mFxList[i]->setText(day[i].mFx);
     // 风力也会涉及"转",我们设置为左边的即可
     index = day[i].mFl.indexOf("转");
     if(index != -1){
     mFlList[i]->setText(day[i].mFl.left(index));
     }
     else{
     mFlList[i]->setText(day[i].mFl);
     }
    }
    mWeekList[0]->setText("今天");
    mWeekList[1]->setText("明天");
    mWeekList[2]->setText("后天");



}

效果演示


如上三图,我们对七天的json数据进行了相应解析,然后将可用内容添加到了我们的七组控件中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/742227.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何做好药店布局,实现客流回归?

随着我国医药市场的不断发展&#xff0c;药店数量逐年增多&#xff0c;竞争愈发激烈。在这种背景下&#xff0c;如何做好药店布局&#xff0c;吸引客流回归&#xff0c;成为药店经营者关注的核心问题。 要想实现店铺形象美观大方、有效引导客流动向&#xff0c;增加顾客在店内…

在动作电影中,如何使用动捕来完成替身演员打戏

随着电影技术的飞速发展&#xff0c;动作电影的制作也日益追求真实与震撼的视觉效果。在这样的背景下&#xff0c;动作捕捉&#xff08;Motion Capture&#xff0c;简称动捕&#xff09;技术成为了制作高质量动作电影的重要工具之一。尤其在替身演员打戏的拍摄中&#xff0c;动…

【SQL Server点滴积累】Setup SQL Server 2008 Database Mirror (二)

【SQL Server点滴积累】Setup SQL Server 2008 Database Mirror (一)-CSDN博客今天分享SQL Server 2008 R2搭建数据库镜像(Database Mirror)https://blog.csdn.net/ncutyb123/article/details/139749117?spm1001.2014.3001.5501本篇Blog基于以上Blog步骤进行SQL Server 2008 R…

红酒品鉴秘籍:一键解锁味觉宇宙,开启你的味觉探险新纪元

红酒&#xff0c;这种优雅的液体&#xff0c;蕴藏着丰富的口感和层次&#xff0c;每一次的品鉴都是一次味觉的探险。今天&#xff0c;就让我们一起探索红酒品鉴的奥秘&#xff0c;解锁味觉的新世界&#xff0c;而在这个过程中&#xff0c;雷盛红酒将成为我们的向导&#xff0c;…

大模型训练十大戒律!!

1.切勿微调&#xff08;Thou Shalt Not Fine-Tune&#xff09;&#xff1a;尽量写prompt&#xff0c;利用大模型本身的能力zeroshot&#xff0c;必要时辅以少量样本&#xff08;few-shot examples&#xff09;或检索增强生成&#xff08;RAG&#xff09;。微调成本高、速度慢且…

Java也能做OCR!SpringBoot 整合 Tess4J 实现图片文字识别

文章目录 1. 环境准备1.1 安装 Tesseract OCR 引擎1.2 引入 Tess4J 依赖 2. 创建 Spring Boot 项目2.1 初始化项目2.2 目录结构 3. 编写 OCR 功能代码3.1 创建服务层3.2 创建控制器层 4. 配置 Tesseract 语言包5. 运行和测试5.1 启动 Spring Boot 应用5.2 使用 Postman 或 cURL…

【2024.6.25】今日 IT之家精选新闻

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

三、用户中心项目笔记----后端多环境实战+原始部署

后端多环境主要是修改&#xff1a; 依赖的环境地址 数据库地址 缓存地址 消息队列地址 项目端口号 服务器配置 后端怎么去区分不同的环境&#xff1f; 我们后端的SpringBoot项目&#xff0c;通过application.yml添加不同后缀来区分配置文件 application.yml就是公共的配置&a…

完美世界否认大规模裁员,存在项目和人员的正常调整

原标题&#xff1a;完美世界回应裁员传闻&#xff1a;确实存在人员调整 项目继续正常研发 易采游戏网6月25日消息&#xff1a;网络上热传完美世界进行史上最大规模裁员&#xff0c;甚至有消息称其两栋办公楼已近乎搬空&#xff0c;同时备受瞩目的游戏项目《完美新世界》和《一拳…

FPGA - DFT(离散傅里叶变换)—FFT(快速傅里叶变化)

一&#xff0c;DFT(离散傅里叶变换原理) 1&#xff0c;DFT(离散傅里叶变换原理)理论简介 在数字信号处理中有一个基本概念&#xff1a; 如果信号在频域是离散的&#xff0c;则该信号在时域就表现为周期性的时间函数&#xff1b;相反&#xff0c;如果信号在时域是离散的&#x…

如何确保消息不被重复消费

一、重复消费问题出现的原因 导致重复消费的原因可能出现在生产者&#xff0c;也可能出现在 MQ 或 消费者。这里说的重复消费问题是指同一个数据被执行了两次&#xff0c;不单单指 MQ 中一条消息被消费了两次&#xff0c;也可能是 MQ 中存在两条一模一样的消费。 生产者&…

LabVIEW高精度电能质量监测系统

LabVIEW和研华采集卡的高精度电能质量监测系统利用虚拟仪器技术&#xff0c;实时监测电能质量的关键指标&#xff0c;如三相电压、频率和谐波。通过提高监测精度和效率&#xff0c;改善电网的电能质量。系 一、系统背景 电能作为现代社会的关键能源&#xff0c;其质量直接影响…

【工具测评】ONLYOFFICE——你的下一款桌面编辑器

文章目录 前言一、安装1.1 跳转官网下载安装包1.2 安装步骤 二、功能介绍2.1 功能全面的 PDF 编辑器2.2 PDF 表单2.3 文本文档编辑器的更新2.4 电子表格编辑器的更新2.5 演示文稿编辑器有哪些更新2.6 所有编辑器中的改进内容2.7 从右至左显示 & 新的本地化选项2.8 可用性提…

Yolo v5实现细节

Yolo v5实现细节 SiLU激活函数 swish和SiLU激活函数:其中β是常量或者是可学习的参数 首先引入swish函数的表达形式&#xff1a; f ( x ) x ⋅ sigmoid ⁡ ( β x ) f(x)x \cdot \operatorname{sigmoid}(\beta x) f(x)x⋅sigmoid(βx) 如果β 1即SiLU激活函数: f ( x ) x …

基于STM32的智能环境监测系统

目录 引言环境准备智能环境监测系统基础代码实现&#xff1a;实现智能环境监测系统 4.1 数据采集模块4.2 数据处理与分析4.3 通信模块实现4.4 用户界面与数据可视化应用场景&#xff1a;环境监测与管理问题解决方案与优化收尾与总结 1. 引言 智能环境监测系统通过使用STM32嵌…

Navicat连接Oracle出现Oracle library is not loaded的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 使用Navicat链接Oracle的时候,出现如下提示:Oracle library is not loaded. 截图如下所示: 2. 原理分析 通常是由于缺少必需的 Oracle 客户端库或环境变量未正确配置所致 还有一种情况是 32位与64位的不匹配:Navica…

如何挑选护眼灯?一分钟带你了解挑选护眼灯的六大准则!

小时候&#xff0c;对正确用眼知识一无所知&#xff0c;也不明白何种光线环境对眼睛最为友善&#xff0c;结果如今的近视度数已濒临千度大关。虽然早已习惯佩戴眼镜的生活&#xff0c;但近视所带来的诸多不便仍旧在日常生活中无处不在。因此&#xff0c;对于家中孩子的视力健康…

昇思25天学习打卡Day01

实验结果 心得体会 趁着假期&#xff0c;跟谁官方实战营开始系统学习MindSpore深度学习框架。昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。其中易开发表现为API友好&#xff0c;调试难度低&#xff1b;高效执行包括…

探索认知智能的未来:知识图谱的崛起

知识图谱点燃语言模型的潜能 ©作者| 潇潇 来源|神州问学 一、 人工智能的三个层次 在人工智能的发展历程中&#xff0c;我们见证了从简单计算到复杂认知的飞跃。人工智能的发展可以概括为三个主要层次&#xff1a;计算智能、感知智能和认知智能。这三个层次不仅代表了技…

Python学习笔记19:进阶篇(八)常见标准库使用之glob模块和argparse模块

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 这里贴一下教程地址&#xff1a;https://docs.python.org/zh-cn/3/tutorial/stdlib.h…