【QT学习笔记】基于QT的天气预报 您所在的位置:网站首页 天气预报和日期显示桌面 【QT学习笔记】基于QT的天气预报

【QT学习笔记】基于QT的天气预报

2024-05-28 17:29| 来源: 网络整理| 查看: 265

【QT学习笔记】基于QT的天气预报 前言那就开始吧!先看一下效果颜面最重要,画个UI构造实现怎么开始?开始解析数据关于城市切换 ok最后源码献上感谢

前言

学习qt已经有一段时间了,做的都是一些单机类的小软件。突然有了兴致,做了这个能联网的软件,天气预报软件。

网络上有很多免费的天气api,有 xml 格式,也有 json 格式的。具体 xml 和 json 有什么区别,这里不做解释,本文所使用天气接口返回的是 json 格式的数据,也只对 json 的数据做处理。

下面是API,末尾接城市ID。在此感谢又拍云(upyun.com)提供CDN赞助。

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

返回的数据就如图中的样子。QT有一堆的QJSON类处理这些数据。 api返回的数据内容

那就开始吧! 先看一下效果

效果图功能解析1.方框1中的图标是当日的天气; 2.方框2中是当前的城市,点击前面的定位图标可更换城市; 3.方框3是当前的温度; 4.箭头4所指向的是手动刷新的按钮,与边上的 ° 凑成 ℃; 5.方框5是当日的预测温度和天气类型; 6.方框6是一些信息,包括日期,风向,and so on,几秒钟会循环显示内容。 在这里插入图片描述这个是城市切换的界面,做的比较简单。点击定位的图标就会弹出窗口,然后输入城市名,会自动联想匹配,点击确定就 OK 了。

颜面最重要,画个UI

在这里插入图片描述虽然只是几个控件而已,但是,布局还是要的,胡乱布局了一下。

构造实现

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

怎么开始?

程序开始运行后,主线程创建 NET_THREAT 类。NET_THREAD 中实例化 QThread,然后将天气的类移入到QThread中运行。 在这里插入图片描述注意,这里有个槽函数关联,slot_new_obj,这个槽函数是用来实例化weather后,weather类中一些对象的实例化的,这样才能真正的在QThread里运行。

程序一开始运行,便会获取第一次天气。

在这里插入图片描述获取完成后,便会发出一个信号,用一个槽函数去接收这些数据。

开始解析数据

在这里插入图片描述在这里插入图片描述 上面的便是我的解析函数了,先是获取了json对象,然后对象传入到每一个小的解析函数里,去分别获取 json 中的字段,然后返回,我用一个结构体去接收这些字段中的值。

在这里插入图片描述以上便是全部的天气的信息。包括实时的天气信息,预报的信息。预报的信息是用数组做的,当然也可以用QList,做成数组或者是QList的好处是,可以用for的形式,给每一天的天气形况赋值,当然,for循环的前提是 ui 中的QLable必须先pop进一个QLable的容器里。

注意到,我解析完数据后,是发出了一个信号。这个信号带的值是所有解析到的天气的信息,他们将被widget中的一个槽函数接收,接下来就很简单了,槽函数获取到的就是整个结构体的内容,可以很方便的将结构体中的值给 ui 中的每一个 label 设置值。

关于城市切换

在这里插入图片描述 当前城市前面的那个定位的图标,其实是一个QLabel,但是因为QLable 没有鼠标点击事件,所以又对 QLabel 做了个自定义控件,并提升了自定义控件。包括手动刷新的按钮也是同样实现的。

前面提到,API的最末尾是城市的ID,那么,ID哪里来呢,中国天气网有,但是我也不知道如何获取,于是,我便从网上找到了一个关于城市ID的 .json 文件(我不知道作者是谁,如果侵权,我将删除),json 中是QJsonArray,里面存储了各个城市的 ID,省,城市拼音。文件已经加到资源里。

在这里插入图片描述上面这个函数就是解析 json 文件中的字段,传入的参数是城市的名字,QString类型,然后将匹配的城市名字显示在 ui 中的 QComboBox 里,并打开 QComboBox。 实现的逻辑是,打开资源中的json文件,获取到QJsonArray jsonArray,然后用循环的方式,逐个的去匹配,如果找到与城市名字相同的字段,则插入到QComboBox里。内容包括了 “省份-城市名”。

选中后,点击确定,dialog会发出一个信号,由weather接收,槽函数得到的是 “省份-城市名”,这样的信息,QString类型,提取出省份和城市名,由相同的方式去搜索ID,只不过,判断的时候,要同时判断 省份 和 城市。 在这里插入图片描述不同之处在于方框中的位置。

ok

OK ! 至此,重要部分的代码就到这里了。 其实这个软件还只是一个半成品,我还没把往后几天的预报做出来,我的想法是,用一个折叠窗口来实现,点击按钮弹出折叠窗口,然后点击隐藏。在主界面上,显示的永远只有几个重要的信息。 坑先挖好,后面来填。

最后源码献上 https://gitee.com/chenjmg/qt-weather.git

我一直做的是C,公司赶鸭子上架,匆忙学了QT,C++做的很少,面对对象的思想还不是很好,代码不足之处,请不吝赐教,不胜感激。

如果还可以,请给我点个赞,谢谢!

感谢

这里面用的都是一些网上找的免费的东西,感谢大神和好人。 如果涉及到侵权,烦请告知,我将删除。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有