Qt项目天气预报(6) - 引入QMap: debug+更新天气图片

news2024/12/28 20:18:46


QMAP  解决bug ()

bug描述

由于json文件中有的地方不带市,有的地方带县,有的地方是区,我们匹配不上这个地方,我们可以使用QString进行字符串拼接来实现。

另外,我们之前的 getCityCodeFromName()函数写得不够灵活,我们可以自定义一个类 CityCodeUtils来实现,使用QMap来存放 city_name  和 city_id 的键值对,让我们匹配的时候更快,没必要遍历寻找,大大提升效率。

cityCodeUtils.h

#ifndef CITYCODEUTILS_H
#define CITYCODEUTILS_H

#include <QMap>



class CityCodeUtils
{
public:
    CityCodeUtils();

    QMap<QString,QString> cityMap={};
    QString getCityCodeFromName(QString cityName);

    void initCityMap();


};

#endif // CITYCODEUTILS_H

cityCodeUtils.cpp
 

#include "citycodeutils.h"

#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>

CityCodeUtils::CityCodeUtils()
{

}

//初始化QMap 并寻找城市名
QString CityCodeUtils::getCityCodeFromName(QString cityName)
{

    if(cityMap.isEmpty()){ // 这个map为空就初始化
    initCityMap(); // 初始化QMap,把json文件内容中的city_name city_code-以键值对的形式添加到QMap对象cityMao中
    }
    //根据城市名寻找对应的QMap对象
    QMap<QString, QString>::iterator it = cityMap.find(cityName);
    if(it == cityMap.end()){
        it=cityMap.find(cityName+"市");
    if(it == cityMap.end())
          it=cityMap.find(cityName+"县");
    if(it == cityMap.end())
          it=cityMap.find(cityName+"区");
      if(it == cityMap.end())
        return ""; // 四种判断都找不到就返回"" --> 会给出对应QMessageBox的报错
    }

   return it.value();
}

// 初始化QMap,把json文件内容中的city_name city_code-以键值对的形式添加到QMap对象cityMao中
void CityCodeUtils::initCityMap()
{
    QFile file(":/citycode.json");
    file.open(QIODevice::ReadOnly);
    QByteArray rawData = file.readAll();
    file.close();

    QJsonDocument jsonDoc = QJsonDocument::fromJson(rawData);

    if(jsonDoc.isArray()){
        QJsonArray citys = jsonDoc.array();
        for(QJsonValue value:citys){
            if(value.isObject()){
                //读取对应键值对
                QString cityName = value["city_name"].toString();
                QString cityCode = value["city_code"].toString();
                //添加到QMap对象中进行初始化
                cityMap.insert(cityName,cityCode);
            }

        }

    }
}

效果演示


更新天气图片

QMap链接上天气和图片


先在构造函数中添加下面内容,链接上对应天气和图片(具体可以根据自己的图片路径修改)
=============================   

// 根据天气插入对应图标
    //根据keys,设置icon的路径

    mTypeMap.insert("暴雪",":/type/BaoXue.png");
    mTypeMap.insert("暴雨",":/type/BaoYu. png");
    mTypeMap.insert("暴雨到大暴雨",":/type/BaoYuDaoDaBaoYu.png");
    mTypeMap.insert("大暴雨",":/type/DaBaoYu.png");
    mTypeMap.insert("大暴雨到特大暴雨",":/type/DaBaoYuDaoTeDaBaoYu.png");
    mTypeMap.insert("大到暴雪",":/type/DaDaoBaoXue.png");
    mTypeMap.insert("大雪",":/type/DaXue.png");
    mTypeMap.insert("大雨",":/type/DaYu.png");
    mTypeMap.insert("冻雨",":/type/DongYu.png");
    mTypeMap.insert("多云",":/type/DuoYun.png");
    mTypeMap.insert("浮沉",":/type/FuChen.png");
    mTypeMap.insert("雷阵雨",":/type/LeiZhenYu.png");
    mTypeMap.insert("雷阵雨伴有冰雹",":/type/LeiZhenYuBanYouBingBao.png");
    mTypeMap.insert("霾",":/type/Mai.png");
    mTypeMap.insert("强沙尘暴",":/type/QiangShaChenBao.png");
    mTypeMap.insert("晴",":/type/Qing.png");
    mTypeMap.insert("沙尘暴",":/type/ShaChenBao.png");
    mTypeMap.insert("特大暴雨",":/type/TeDaBaoYu.png");
    mTypeMap.insert("undefined",":/type/undefined.png");
    mTypeMap.insert("雾",":/type/Wu.png");
    mTypeMap.insert("小到中雪",":/type/XiaoDaoZhongXue.png");
    mTypeMap.insert("小到中雨",":/type/XiaoDaoZhongYu.png");
    mTypeMap.insert("小雪",":/type/XiaoXue.png");
    mTypeMap.insert("小雨",":/type/XiaoYu.png");
    mTypeMap.insert("雪",":/type/Xue.png");
    mTypeMap.insert("扬沙",":/type/YangSha.png");
    mTypeMap.insert("阴",":/type/Yin.png");
    mTypeMap.insert("雨",":/type/Yu.png");
    mTypeMap.insert("雨夹雪",":/type/YuJiaXue.png");
    mTypeMap.insert("阵雪",":/type/ZhenXue.png");
    mTypeMap.insert("阵雨",":/type/ZhenYu.png");
    mTypeMap.insert("中到大雪",":/type/ZhongDaoDaXue.png");
    mTypeMap.insert("中到大雨",":/type/ZhongDaoDaYu.png");
    mTypeMap.insert("中雪",":/type/ZhongXue.png");
    mTypeMap.insert("中雨",":/type/ZhongYu.png");

===========================================
然后在 中加入 parseWeatherJsonData() 函数中

  ui->labelWeatherIcon->setPixmap(mTypeMap[objRoot["wea"].toString()]);

  // 根据键值对匹配对应图片

如下图

效果演示

如下图,不同城市的不同天气就行了一波对应图片的更新

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用python连接dy直播间的websocket消息,竟然一会就自动断开了

使用python的websocket创建一个客户端连接直播间的消息&#xff0c;可是过一会就自动断开了&#xff0c;使用rust尝试连接也是一样的效果&#xff0c;过一会就自动断开了&#xff0c;而且报错&#xff1a; 我们先使用python建立一个客户端试一下&#xff1a; # 导入websocket-…

免费的AI在线写作工具,让写作变的更简单

在如今的时代&#xff0c;写作已经成为了我们日常生活中不可或缺的一部分。无论是自媒体创作者、学生还是办公职场人员&#xff0c;都有内容创作的需求。然而&#xff0c;写作过程往往伴随着灵感枯竭、查找资料费时等问题。下面小编就来和大家分享几款免费的AI在线写作工具&…

桌面编辑器ONLYOFFICE 功能多样性快来试试吧!

目录 ONLYOFFICE 桌面编辑器 8.1 ONLYOFFICE介绍 主要功能和特点 使用场景 1.PDF编辑器 2.幻灯片版式 3.编辑&#xff0c;审阅和查看模式 4.隐藏连接到云版块 5.RTL语言支持和本地化选项 6.媒体播放器 7、其他新功能 8.下载 总结 ONLYOFFICE 桌面编辑器 8.1 官网地…

视频监控EasyCVR视频汇聚/智能边缘网关:EasySearch无法探测到服务器如何处理?

安防监控EasyCVR智能边缘网关/视频汇聚网关/视频网关属于软硬一体的边缘计算硬件&#xff0c;可提供多协议&#xff08;RTSP/RTMP/国标GB28181/GAT1400/海康Ehome/大华/海康/宇视等SDK&#xff09;的设备接入、音视频采集、视频转码、处理、分发等服务&#xff0c;系统具备实时…

数字人视频剪辑解决方案,个性化定制服务

如何高效、专业地剪辑出高质量的数字人视频&#xff0c;却成为众多企业面临的难题。针对这一挑战&#xff0c;美摄科技凭借其在人工智能、计算机视觉等领域的深厚积累&#xff0c;推出了面向企业的数字人视频剪辑解决方案&#xff0c;为企业带来前所未有的视频制作新体验。 一…

Spring Cloud学习:如何实现Gateway 服务网关限流

目录 一、Spring Cloud介绍二、什么是服务网关三、Gateway的优势和应用场景四、如何实现Gateway 服务网关限流 一、Spring Cloud介绍 Spring Cloud是一个基于Spring Boot的微服务架构开发工具集&#xff0c;它整合了多种微服务解决方案&#xff0c;为开发者提供了一站式的微服…

智慧协同革新工业设计,创作评审无界畅达

工业产品研发是一个结合了创意、艺术和技术的综合性行业。设计师们通过深入理解文化、市场和消费者需求&#xff0c;运用各种材料和工艺&#xff0c;创造出具有独特魅力和价值的工业产品。这个行业涵盖了从设计、制作到销售等多个环节&#xff0c;需要团队成员之间的紧密协作和…

银联支付,你竟然还不知道它怎么工作?

银联支付咱都用过&#xff0c;微信和支付宝没这么“横行”的时侯&#xff0c;我们取款、转账、付款时用的ATM机、POS机&#xff0c;都是银联支付完成的。 今天&#xff0c;就让咱们了解一下银行卡支付的工作原型。 首先&#xff0c;说说中国银联 中国银联&#xff08;China U…

如何区分应用所在的运行环境?

常见的应用运行环境主要有&#xff1a;物理机、虚拟机、容器或 K8s&#xff0c;那么如何确定应用运行在哪种未知环境下呢&#xff1f;本文主要介绍如何通过一种简单方式来判断应用当前所在的运行环境。 1 物理机 物理机和虚拟机因为都是完整的操作系统。因此可以用dmidecode来…

ETO MARKETS:美股涨势告急?通胀风暴或成市场新拐点

摘要&#xff1a; 近期美股涨势引发了市场对其可持续性的质疑。随着通胀数据的发布&#xff0c;全球利率前景可能面临新的变化。投资者需关注即将到来的通胀数据及其对市场的影响。本周的市场波动加剧&#xff0c;政治风险和经济数据共同作用&#xff0c;将为未来的市场走向提…

《计算机英语》Unit 1 Computer Overview 计算机概述

期末试卷组成 1、选择20道 2、判断20道 3、词汇翻译&#xff08;单词词组&#xff0c;参照课后习题&#xff09; 4、翻译2道&#xff08;一道原题&#xff0c;参照作业&#xff09; SectionA About Computer 关于计算机 algorithm n. 算法 operate v.…

华媒舍:8个使你东南亚地区媒体发稿方式

下面我们就为大家介绍8种方法&#xff0c;能够帮助你在东南亚地区的媒体发稿环节中游刃有余。无论您是一名公关人员、市场营销专家还是普通的新闻记者&#xff0c;这个方法也将对你具有协助。 1.掌握总体目标受众在东南亚地区公布媒体稿子时&#xff0c;最重要的步骤是掌握总体…

小米录屏怎么录?教你2种方法轻松录屏

“最近新换的小米手机&#xff0c;但不知道怎样打开小米手机的录屏功能啊&#xff1f;而且有没有办法能录制到手机的高清画面啊&#xff1f;谁能教教我啊&#xff1f;” 随着科技的飞速发展&#xff0c;录屏功能逐渐成为我们手机使用中不可或缺的一部分。在众多录屏工具中&…

一文搞懂Linux多线程【上】

目录 &#x1f6a9;引言 &#x1f6a9;再次理解页表 &#x1f6a9;初识线程 &#x1f6a9;线程和pthread库 &#x1f680;线程创建 &#x1f6a9;线程的资源共享问题 &#x1f6a9;线程的优缺点 &#x1f6a9;引言 今天&#xff0c;我们开始学习Linux中的线程部分。Lin…

双 μC 的 PWM 频率和分辨率

该方法是过滤 PWM 信号的 HF 分量&#xff0c;只留下与占空比成正比的 LF 或 DC 分量。然而&#xff0c;低通滤波器并不能完全滤除PWM频率&#xff0c;因此LF/DC信号一般会有一些纹波。 有两种方法可以降低 PWM DAC 的纹波。可以降低低通滤波器的截止频率&#xff0c;或者提高…

javaScript(八) 对象

}, “arm”:{ //属性名 configurable:true, //允许删除&#xff0c;允许使用defineProperty()修改属性描述符 enumerable:true, //允许被搜索到 set:function (value) { //给这个属性设置一个函数&#xff0c;注意&#xff0c;调用对象的函数的方法是xm.xarm()&#xff0c;…

MacOS - ToDesk 无法远程操控鼠标键盘解决方案

问题描述 远程后发现画面显示正常&#xff0c;但是键盘和鼠标的操作没有响应。 原因分析 可能是辅助功能没有勾选ToDesk_Session的权限。 解决方案 系统设置 - 隐私与安全性 - 辅助功能 进去后找到 ToDesk&#xff0c;开关打开&#xff0c;输入系统密码&#xff0c;重启 App …

从0构建一个录制UI测试工具

很多UI自动化测试工具都具备录制UI自动化测试的能力&#xff0c;例如playwright&#xff0c;可以通过playwright vscode插件完成录制&#xff0c;如下图所示&#xff0c;当选择录制脚本时&#xff0c;会打开一个浏览器&#xff0c;在浏览器中输入被测应用url&#xff0c;用户在…

vscode用vue框架1写一个登陆页面

目录 一、创建登录页面 二、构建好登陆页面的路由 三、编写登录页代码 1.添加基础结构 2.给登录页添加背景 3.解决填充不满问题 4.我们把背景的红颜色替换成背景图&#xff1a; 5.在页面中央添加一个卡片来显示登录页面 6.设置中间卡片页面的左侧 7.设置右侧的样式及…

CPU1511作为CPU1513的智能IO设备

一、把一个IO控制器作为另一个IO控制器的IO设备来使用 1、在智能设备通信里定义好传输区后&#xff0c;导出GSD文件 2、在另一个项目程序内添加GSD文件 3、当作PLC的IO设备组态&#xff0c;并连接至PLC_1 4、在右侧更改I区、Q区地址与名称 5、硬件编译并下载&#xff0c;此…