前言

经过之前一段时间的QT学习,做出一个小软件来总结自己掌握关于qt的知识点。网络上有许多免费的天气接口(api),有xml格式的,也有json格式的。具体xml和json有什么区别,这里我就不去深究了,我们这里用的是一个json格式的数据,所以重点是对json格式的数据进行处理。

 效果的展示

颜面是很重要的,首先介绍我的ui

然后介绍ui上各个按键的功能

“1”:这是小狗按钮,点击此键,跳转出一个小狗界面

tips:点击小狗即可实现播报出今天的天气内容,以及温馨提醒。

“2”:实时温度

“3”:现在的天气图片状态

“4”:现在的天气文字状态

“5”:具体今天的温度范围

“6”:刷新界面,然后访问api接口

“7”:定位选择的城市

构造实现

把 ui 和 网络请求解析 分开,ui 是主线程,网络的请求解析是一个单独的线程,net_thread.cpp是线程的文件,将weather.cpp类移入到线程中运行,这样在解析数据的时候,如果数据过大,不至于会影响到 ui 的响应。
把所有的图片都加到了资源里,资源里还有一个包含了所有城市ID的.json文件(这是在网上不知道哪个不知名大佬总结的),在获取天气信息之前,需要先将 .json 里的城市ID读取出来,在拼凑成一个完整的 url 。

#ifndef NET_THREAD_H
#define NET_THREAD_H#include <QObject>
#include <QThread>#include <class_weather/weather.h>class NET_THREAD : public QObject
{Q_OBJECT
signals:void thread(QString);
public:explicit NET_THREAD(QObject *parent = nullptr);~NET_THREAD();QThread * qThread = nullptr;WEATHER * weather = nullptr;void startThread();void stopThread();signals:};#endif // NET_THREAD_H

api接口函数,json数据的分段

        

http://t.weather.sojson.com/api/weather/city/城市ID

连接api之后,返回的数值如图所示:

 那我们该如何对返回的数据进行分段处理呢?

这里借鉴了csdn上大佬的处理方法:

数据的分段:

JSON返回示例 :
{
errNum: 0,
errMsg: "success",
retData: {city: "北京", //城市pinyin: "beijing", //城市拼音citycode: "101010100",  //城市编码   date: "15-02-11", //日期time: "11:00", //发布时间postCode: "100000", //邮编longitude: 116.391, //经度latitude: 39.904, //维度altitude: "33", //海拔 weather: "晴",  //天气情况temp: "10", //气温l_tmp: "-4", //最低气温h_tmp: "10", //最高气温WD: "无持续风向",  //风向WS: "微风(<10m/h)", //风力sunrise: "07:12", //日出时间sunset: "17:44" //日落时间}
}
备注 :
请将apikey作为参数添加到header中;
当返回{"errNum":300003,"errMsg":"url is not parse"} 时,请校验是否传入apikey;

为了取到其中的各条信息需要用到JSON数据的解析

$cityname = urlencode($_POST['cityname']);//设置天气API的url地址,初始化cURL 根据城市名称查询$url = 'http://apis.baidu.com/apistore/weatherservice/cityname?cityname='.$cityname; //天气API//$this->display();$ch = curl_init();$header = array('apikey: e858d877f6febd23d6623e14a3dbf220',);//设置cURL的相关参数,执行HTTP请求curl_setopt($ch,CURLOPT_URL,$url);// 添加apikey到headercurl_setopt($ch, CURLOPT_HTTPHEADER  , $header);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);//采集数据$output = curl_exec($ch);//关闭curl_close($ch);$res = json_decode($output,true);   //将生成的结果转化为json数据$this->assign('city',$res["retData"]['city']);$this->assign('date',$res["retData"]['date']);$this->assign('time',$res["retData"]['time']);$this->assign('temp',$res["retData"]['temp']);$this->assign('l_tmp',$res["retData"]['l_tmp']);$this->assign('h_tmp',$res["retData"]['h_tmp']);$this->assign('weather',$res["retData"]['weather']);$this->assign('WS',$res["retData"]['WS']);$this->display();

通过这种方式就可以获取其中的每条信息。这种方式基本可以处理所有API返回数据。

$city = $res["resData"]["city"];

分段之后我们用文本的方式记录下来:

关于界面跳转问题

当我们点击地点查询,和小狗这两个按钮,我们的主界面会消失然后分别出现

小狗:

地点查询:

关于界面的跳转,我都是运用信号与槽的方式来实现的。

具体代码:

思路:

拿小狗界面举例,首先我用hide隐藏小狗这个界面,当我点击小狗这个按钮的时候,实现小狗显示,然后在小狗的类里实现主界面的消失隐藏,形成一种交互过程,实现了点击按钮,一个消失一个出现。

天气图标实现 

在网上找到了很多关于天气打包好的图片:

然后把这些图片添加到资源,例如:

然后每个图片通过比较字符串判断是什么天气,例如:

如果是小雨,则会去找到小雨天气的图片的路径并且显示出来:

代码实现

 if(info->forecast[0].weatherType.contains("多云")){pixmap = ":/icons/weather_icons/duoyun.png";}else if(info->forecast[0].weatherType.contains("晴")){pixmap = ":/icons/weather_icons/qing.png";}else if(info->forecast[0].weatherType.contains("小雨")){pixmap = ":/icons/weather_icons/xiaoyu.png";}else if(info->forecast[0].weatherType.contains("沙尘")){pixmap = ":/icons/weather_icons/shachen.png";}else if(info->forecast[0].weatherType.contains("雾霾")){pixmap = ":/icons/weather_icons/wumai.png";}else if(info->forecast[0].weatherType.contains("雪转晴")){pixmap = ":/icons/weather_icons/xuezhuanqing.png";}else if(info->forecast[0].weatherType.contains("夜多云")){pixmap = ":/icons/weather_icons/yeduoyun.png";}else if(info->forecast[0].weatherType.contains("中雨")){pixmap = ":/icons/weather_icons/zhongyu.png";}else if(info->forecast[0].weatherType.contains("暴雨")){pixmap = ":/icons/weather_icons/baoyu.png";}else if(info->forecast[0].weatherType.contains("冰雹")){pixmap = ":/icons/weather_icons/bingbao.png";}else if(info->forecast[0].weatherType.contains("大雪")){pixmap = ":/icons/weather_icons/daxue.png";}else if(info->forecast[0].weatherType.contains("大雨")){pixmap = ":/icons/weather_icons/dayu.png";}else if(info->forecast[0].weatherType.contains("雷雨")){pixmap = ":/icons/weather_icons/leiyu.png";}ui->label_weather_icon->setPixmap(QPixmap(pixmap));
}

小狗语音播报 

当我们点击小狗,小狗就会自动播报处今天的天气情况,以及提醒。我是这样实现的:

因为,天气的数据处理和小狗不是同一个类,所以我决定在天气数据的类里创建一个文本文件,然后经过字符格式的转换写入文件,然后进行文本的换行处理,在狗的类里在根据路径打开文本文件并朗读,使语音有分段。

具体代码

天气类里实现的部分

  QFile file("qwer.txt");char *zxc="\n";file.open(QIODevice::WriteOnly);file.write(info->cityName.toUtf8());char* zaxc="今日实时温度";file.write(zxc);file.write(zaxc);file.write(info->realTime.temp.toUtf8());
file.write(zxc);file.write(info->forecast[0].temp.toUtf8());file.write(zxc);file.write(info->forecast[0].weatherType.toUtf8());file.write(zxc);for(int i=0;i<4;i++){QString str=showMessageList[i];QByteArray buf =str.toUtf8();file.write(buf);file.write(zxc);}file.close();

小狗类里实现的部分

QTextToSpeech *s = new QTextToSpeech;QFile file("qwer.txt");file.open(QIODevice::ReadOnly);QByteArray zbc;zbc=file.readAll();s->say(zbc);

QT练手小项目-——天气播报小狗(ui展示分析,构造实现,json格式数据分析,界面交互,天气图标处理,小狗语音)相关推荐

  1. 13 个适合『中级开发者』练手的项目

    本文整理自『机器之心』 编辑 / sitin 本文将列出十三个适合中级 Python 开发人员练手的项目. Web 项目设计 1.内容聚合器(Content Aggregator) 1. 技术细节 该 ...

  2. 软件测试分享15个适合练手的项目【金融/银行/商城/电商/医药......】

    还愁没有练手的项目?我已经给你准备好了,需要评论区留下你的想法吧 1.引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 ...

  3. springboot+vue练手级项目,真实的在线博客系统

    文章目录 spring boot 练手实战项目说明 基础知识 面试准备 1. 工程搭建 1.1 新建maven工程 1.1.2遇到的bug 1.2 配置 1.3 启动类 2. 首页-文章列表 2.1 ...

  4. 学会这样用Github搜索,再也不用到处找练手的项目了

    今天来介绍下如何在GitHub搜索项目.相信很多小伙伴都不知道如何搜索. 以搜索Spring项目为例. 直接搜索 直接搜索 74万条项目,多的你不知选用哪条. 按标题名称搜索 只搜索标题含有sprin ...

  5. C语言小项目之“究极无敌螺旋丸极爆炸狂拽炫酷五彩棒的”通讯录之*派小猩*作品

    C语言小项目之"究极无敌螺旋丸极爆炸狂拽炫酷五彩棒的"通讯录之派小猩作品 项目概述 基于C语言开发一个多功能的通讯录 功能目录 1.增加 2.删除 3.查找 4.修改 5.显示 6 ...

  6. QT练手小项目:飞机大战

    目录 1.项目简介 2.创建项目 3.设置主场景导入资源 3.1配置文件 3.2主场景的初始化 3.3资源导入 4.地图滚动的实现 4.1创建地图文件和类 4.2添加地图类的成员函数和成员属性 5.创 ...

  7. 找工作前练手前端项目实战2

    这篇文章千锋长沙前端培训机构整理了10个前端实战项目,大家可以从当中选择自己想做的项目进行参考学习练手,你也可以从中寻找灵感去做自己的项目. 1.仿小米电商网站:本项目是基于原生JavaScript等 ...

  8. 适合前端初学者的:学习笔记 + 练手开源项目(持续更新ing)

    1.说明 最近想学习一下Web前端知识,本着理论 + 实践的学习路径,找了一些学习资源和开源项目练一下手. 2.路线规划 关于前端学习路线的一些建议 3.学习资源 菜鸟教程(里面有很多基础的教程和示例 ...

  9. Android 练手完整项目app(二)Banner+多布局RecyclerView列表

    更新第二弹,主要内容HomeFragment页面设计Banner+RecyclerView,多布局列表展示,页面xml较多,RecyclerView的适配器只写了3个多布局,后期可优化扩展. 1. 搭 ...

最新文章

  1. 如何设计 Web App 应用架构?「两分钟了解 IOING」
  2. Wireshark抓包工具使用教程以及常用抓包规则
  3. 你知道前端单页面路由是怎么实现的吗?
  4. sizeof之字节对齐
  5. 【Java小游戏】小球躲避游戏 图片轮播爆炸效果、边缘反弹、计时功能
  6. TypeScript strictness - 严格语法检查
  7. fig,ax = plt.subplots()
  8. 如何理解typedef void
  9. Hibernate之事务处理
  10. opencv imshow plt imshow
  11. Spark MLlib(一)正则化特征
  12. label之间展示间距_工法样板如何做?碧桂园质量工法样板展示区做法标准
  13. ProjectZomboid服务器搭建
  14. 拼多多签名认证Sign
  15. 仿真软件proteus构建LCD1602四线驱动实验
  16. 香港虚拟主机和美国虚拟主机的区别体现在哪些方面
  17. LocalDate、LocalDateTime计算时间差
  18. 快速排序——寻找数组第K大数(由浅入深,四种方法对比讲解!)
  19. 阿里云基于区块链服务构建企业业务系统实践总结
  20. swaks伪造钓鱼邮件

热门文章

  1. java拼团小程序源码(毕设)
  2. 公众号+拼团小程序,教培机构招生新玩法
  3. XP系统关机提示“你可以安全地关机了”的解决
  4. 宏碁ES1-433笔记本BIOS无法更改启动项解决办法
  5. python辅助开发模块(非官方)如pil,mysqldb,openpyxl,xlrd,xlwd
  6. pt100 c 语言,PT100计算公式_C程序.doc
  7. “无代码”时代,离我们还有多远?
  8. openjudge 1.10.3 成绩排序
  9. 最简单的基于FFMPEG+SDL的音频播放器 拆分-解码器和播放器
  10. 网络安全-蜜罐学习笔记