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


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()]);

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

如下图

效果演示

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

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

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

相关文章

Screw - 数据库表结构文档生成器

Screw-自动化程度高&#xff0c;能快速生成文档&#xff0c;减少手动编写的工作量 支持多种数据库生成HTML、Word、MarkDown 三种格式的文档 快速上手&#xff0c;以Oracle方式为例 第一种方式&#xff1a;Maven 插件 1、引入 <build><plugins><plugin>&…

vue中图谱关系插件relation-graph

vue中图谱关系插件relation-graph 一、效果图二、安装下载&#xff08;vue2.0版本的&#xff09;三、直接上代码 一、效果图 二、安装下载&#xff08;vue2.0版本的&#xff09; npm install --save relation-graph var foo bar;三、直接上代码 <template><div cla…

LeetCode 热题100 --双指针

双指针 b站UP主蜜糖&#xff1a;由于数据特征的有序性&#xff08;大小或者正负&#xff09;&#xff0c;所以可以证明当前节点一定是优于过往节点&#xff0c;从而可以通过数据的维度数量的指针&#xff0c;逐步的迭代收敛最终找到最优解。 283.移动零 相关标签 &#xff1a;…

TypeScript(笔记版)

简介&#xff1a; nvm安装必须先把自己的node卸了&#xff0c;再去安装nvm TS就是js的超集 对js进行了扩展 浏览器不支持ts&#xff0c;要转换为js才可以。 ts是用来编程人员爽的 js的写法拿到ts也可以&#xff0c;ts代码量更大&#xff0c;但ts代码更加清晰 可以在playg…

数显胎压计方案采用SIC8632主控芯片

汽车作为现代出行的重要工具&#xff0c;极大地提升了人们的出行效率。随着生活品质的提升&#xff0c;越来越多的家庭拥有了私家车。然而&#xff0c;对于车主而言&#xff0c;掌握驾驶技巧只是基础&#xff0c;了解如何正确检测汽车胎压同样至关重要。胎压计&#xff0c;即气…

年化16.6%,全球大类资产使用lightGBM预测轮动——数据缓存提升效率

原创文章第568篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 Dataloader缓存 加载160个因子&#xff0c;10几支大类资产&#xff0c;这个计算还是需要一点时间&#xff0c;尤其在我们频繁运行的时候&#xff0c;需要等待&#xff0c;这里我们…

深入分析 Android BroadcastReceiver (六)

文章目录 深入分析 Android BroadcastReceiver (六)1. 广播机制的高级优化策略1.1 使用 Sticky Broadcast&#xff08;粘性广播&#xff09;示例&#xff1a;粘性广播&#xff08;过时&#xff0c;不推荐&#xff09; 1.2 使用 LiveData 和 ViewModel 进行组件通信示例&#xf…

dockercompose部署redis哨兵模式并集成springboot

第一步 编写compose文件 docker-compose.yml version: 3.8networks:redis-network:driver: bridgeservices:redis-master:image: redis:7.2.4container_name: redis-mastercommand: ["sh", "-c", "redis-server --protected-mode no --slave-announ…

[leetcode hot 150]第十一题,盛水最多的容器

题目&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾…

基于Java实验室课程管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

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

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

冲上热搜!太“上头”!除了这碗粉,它还坐拥“全球第一”!

千年前&#xff0c;唐代诗人柳宗元便与柳州结下不解之缘&#xff0c;通晓医理的他&#xff0c;竟然是螺蛳粉的初代“推广大使”&#xff1b;如今&#xff0c;柳州螺蛳粉全产业链一年狂揽近670亿元&#xff0c;还走出了国际范儿。 百年前&#xff0c;斜阳路的电灯点亮这座城市的…

oracle报错-ORA-12638:身份证明检索失败

navicat16连接本地oracle数据库成功后&#xff0c;连接远程数据库&#xff0c;同样是oracle11g&#xff0c;确认网络、用户名、密码都没问题的情况下&#xff0c;报错ora-12638。 解决方法&#xff1a; 这是由于Oracle的认证方式使用了本地操作系统认证&#xff08;NTS&#x…

SpringBoot-配置文件中使用随机值和使用变量

1、配置文件中使用随机值 2.在配置文件使用引用变量 如果没定义还可以设置默认值

2024届应届生突破1179万人,如何瞄准AI行业,获得高薪职业前景

应届生如何开启AI行业的职业生涯&#xff1f; ©作者|Zhongmei 来源|神州问学 引言 人工智能和数据科学几乎可以在任何产生数据的场合中发挥作用&#xff0c;因为它们开辟了一种全新的范式——让机器能够从数据中提炼出知识。自2011年人工智能走出实验室的门槛&#xff0c…

48-5 内网渗透 - JuicyPotato、Pipe Potato提权

Juicy Potato Juicy Potato 与 Rotten Potato(烂土豆) 的原理几乎完全相同,只是在后者的基础上做了扩展,以便更灵活地利用 Rotten Potato。Juicy Potato 不再像 Rotten Potato 那样依赖于一个现有的 Meterpreter,并且可以自定义 COM 对象加载的端口,以及根据系统版本更换…

春招面试面经总结篇

目录 前言一&#xff0c;算法篇1.1 平拍数组1.2 括号匹配1.3 打家劫舍1.4 删除最少使字符串平衡1.5 爬楼梯 二&#xff0c;数据结构篇2.1 二叉树2.2 链表 三&#xff0c;HTML篇3.1 H5新的语义标签3.2 href和src 四&#xff0c;CSS篇4.1 居中4.2 父元素塌陷解决4.3 外边距塌陷4.…

神经网络 #数据挖掘 #Python

神经网络是一种受生物神经元系统启发的人工计算模型&#xff0c;用于模仿人脑的学习和决策过程。它由大量互相连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;这些节点处理和传递信息。神经网络通常包含输入层、隐藏层&#xff08;可有多个&#xff09;和输出层…

基于SpringBoot的实习管理系统设计与实现

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBoot框架&#xff0c;B/S模式 工具&#xff1a; MyEclipse&#xff0c;Tomcat 系统展示 …

TCP编程

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 由于TCP连接具有安全可靠的特性&#xff0c;所以TCP应用更为广泛。创建TCP连接时&#xff0c;主动发起连接的叫客户端&#xff0c;被动响应连接的叫服…