QT练手小项目-——天气播报小狗(ui展示分析,构造实现,json格式数据分析,界面交互,天气图标处理,小狗语音)
前言
经过之前一段时间的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格式数据分析,界面交互,天气图标处理,小狗语音)相关推荐
- 13 个适合『中级开发者』练手的项目
本文整理自『机器之心』 编辑 / sitin 本文将列出十三个适合中级 Python 开发人员练手的项目. Web 项目设计 1.内容聚合器(Content Aggregator) 1. 技术细节 该 ...
- 软件测试分享15个适合练手的项目【金融/银行/商城/电商/医药......】
还愁没有练手的项目?我已经给你准备好了,需要评论区留下你的想法吧 1.引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 ...
- springboot+vue练手级项目,真实的在线博客系统
文章目录 spring boot 练手实战项目说明 基础知识 面试准备 1. 工程搭建 1.1 新建maven工程 1.1.2遇到的bug 1.2 配置 1.3 启动类 2. 首页-文章列表 2.1 ...
- 学会这样用Github搜索,再也不用到处找练手的项目了
今天来介绍下如何在GitHub搜索项目.相信很多小伙伴都不知道如何搜索. 以搜索Spring项目为例. 直接搜索 直接搜索 74万条项目,多的你不知选用哪条. 按标题名称搜索 只搜索标题含有sprin ...
- C语言小项目之“究极无敌螺旋丸极爆炸狂拽炫酷五彩棒的”通讯录之*派小猩*作品
C语言小项目之"究极无敌螺旋丸极爆炸狂拽炫酷五彩棒的"通讯录之派小猩作品 项目概述 基于C语言开发一个多功能的通讯录 功能目录 1.增加 2.删除 3.查找 4.修改 5.显示 6 ...
- QT练手小项目:飞机大战
目录 1.项目简介 2.创建项目 3.设置主场景导入资源 3.1配置文件 3.2主场景的初始化 3.3资源导入 4.地图滚动的实现 4.1创建地图文件和类 4.2添加地图类的成员函数和成员属性 5.创 ...
- 找工作前练手前端项目实战2
这篇文章千锋长沙前端培训机构整理了10个前端实战项目,大家可以从当中选择自己想做的项目进行参考学习练手,你也可以从中寻找灵感去做自己的项目. 1.仿小米电商网站:本项目是基于原生JavaScript等 ...
- 适合前端初学者的:学习笔记 + 练手开源项目(持续更新ing)
1.说明 最近想学习一下Web前端知识,本着理论 + 实践的学习路径,找了一些学习资源和开源项目练一下手. 2.路线规划 关于前端学习路线的一些建议 3.学习资源 菜鸟教程(里面有很多基础的教程和示例 ...
- Android 练手完整项目app(二)Banner+多布局RecyclerView列表
更新第二弹,主要内容HomeFragment页面设计Banner+RecyclerView,多布局列表展示,页面xml较多,RecyclerView的适配器只写了3个多布局,后期可优化扩展. 1. 搭 ...
最新文章
- 如何设计 Web App 应用架构?「两分钟了解 IOING」
- Wireshark抓包工具使用教程以及常用抓包规则
- 你知道前端单页面路由是怎么实现的吗?
- sizeof之字节对齐
- 【Java小游戏】小球躲避游戏 图片轮播爆炸效果、边缘反弹、计时功能
- TypeScript strictness - 严格语法检查
- fig,ax = plt.subplots()
- 如何理解typedef void
- Hibernate之事务处理
- opencv imshow plt imshow
- Spark MLlib(一)正则化特征
- label之间展示间距_工法样板如何做?碧桂园质量工法样板展示区做法标准
- ProjectZomboid服务器搭建
- 拼多多签名认证Sign
- 仿真软件proteus构建LCD1602四线驱动实验
- 香港虚拟主机和美国虚拟主机的区别体现在哪些方面
- LocalDate、LocalDateTime计算时间差
- 快速排序——寻找数组第K大数(由浅入深,四种方法对比讲解!)
- 阿里云基于区块链服务构建企业业务系统实践总结
- swaks伪造钓鱼邮件
热门文章
- java拼团小程序源码(毕设)
- 公众号+拼团小程序,教培机构招生新玩法
- XP系统关机提示“你可以安全地关机了”的解决
- 宏碁ES1-433笔记本BIOS无法更改启动项解决办法
- python辅助开发模块(非官方)如pil,mysqldb,openpyxl,xlrd,xlwd
- pt100 c 语言,PT100计算公式_C程序.doc
- “无代码”时代,离我们还有多远?
- openjudge 1.10.3 成绩排序
- 最简单的基于FFMPEG+SDL的音频播放器 拆分-解码器和播放器
- 网络安全-蜜罐学习笔记