基于QT天气预报项目,推荐初学者练手


前言


本项目基于QT平台开发的一款天气预报,一个适合小白练手的项目。使用到了技术有HTTP编程、定位API、天气预报API、JSON解析,unicode转化为汉字。分享给大家一起讨论学习;

一、项目界面

![](https://img-blog.csdnimg.cn/2f2835ee81a544989643cb7db2614b48.png

界面没有选择UI布局,使用代码布局为了加深对QT的熟练,看个人爱好

二、使用讲解

启动界面
在这里插入图片描述
搜索城市 :重庆
在这里插入图片描述
定位当前城市
在这里插入图片描述

三、相关功能实现

QT的网络编程需要 添加一个network
在这里插入图片描述

大多数的天气api中不支持自动定位功能,需要手动的设置城市名称,但是这不符合我们实际生活的使用情况,所以在天气api之前我们还需要一个定位ip,这里我使用的是百度ip定位api

1)百度ip定位api

https://api.map.baidu.com/location/ip?ak=您的AK&ip=您的IP&coor=bd09ll
AK注册百度开发者平台就可获得

在这里插入图片描述

json返回数据如下

{
"address":"CN|\u56db\u5ddd\u7701|\u6210\u90fd\u5e02|None|None|100|100",
"content":{
			"address":"\u56db\u5ddd\u7701\u6210\u90fd\u5e02",
			"address_detail":{
							"adcode":"510100",
							"city":"\u6210\u90fd\u5e02",
							"city_code":75,
							"district":"",
							"province":"\u56db\u5ddd\u7701",
							"street":"",
							"street_number":""
							},
			"point":{
				"x":"104.07274727",
				"y":"30.57899372"
				}
		},
"status":0
}

第一时间发现不懂,但是状态码表示正常,由于本人也是小白经验不足,也没有提示信息,在这如果觉得麻烦可以换成其他api,比如高德api,但是我死磕了两天搞懂了含义,其实返回的是unicode码,了解了原理过后我们就只要把unicode码转换为汉字就ok了,这里我提供一个转换代码

unicode码 转换 汉字

QString filename;
do
   {
        int idx = filename.indexOf("\\u");
        QString strHex = filename.mid(idx, 6);
        strHex = strHex.replace("\\u", QString());
        int nHex = strHex.toInt(0, 16);
        filename.replace(idx, 6, QChar(nHex));
    } while (filename.indexOf("\\u") != -1);

然后得到数据为

{
"address":"CN|四川省|成都市|None|None|100|100",
"content":{
			"address":"四川省成都市",
			"address_detail":{
							"adcode":"510100",
							"city":"成都市",
							"city_code":75,
							"district":"",
							"province":"四川省",
							"street":"",
							"street_number":""
							},
			"point":{
				"x":"104.07274727",
				"y":"30.57899372"
				}
		},
"status":0
}

JSON返回数据
在这里插入图片描述

调用代码

    //发送http请求
void Widget::get_city(void)
{
    QNetworkRequest request;
    request.setUrl(QUrl("https://api.map.baidu.com/location/ip?ak=您的AK&ip=您的IP&coor=bd09ll"));
    requst_city->get(request);
}
    //json解析
void Widget::json_city(QNetworkReply *reply)
{
    QString all = reply->readAll();
    
    //unicode 转化为汉字
    QString filename = all;
    do
    {
        int idx = filename.indexOf("\\u");
        QString strHex = filename.mid(idx, 6);
        strHex = strHex.replace("\\u", QString());
        int nHex = strHex.toInt(0, 16);
        filename.replace(idx, 6, QChar(nHex));
    } while (filename.indexOf("\\u") != -1);
     //json解析过程
    QJsonDocument  Document;
    QJsonParseError json_error;
    QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(),&json_error);//解析json对象
    QJsonObject object = json_recv.object();
    if(object.contains("content"))
    {
       QJsonValue value = object.value("content");
       if(value.isObject())
       {
           QJsonObject object_1 = value.toObject();
           if(object_1.contains("address_detail"))
           {
               QJsonValue value_1 = object_1.value("address_detail");
               if(value_1.isObject())
               {
                   QJsonObject object_2 = value_1.toObject();
                   locat_city =object_2.value("city").toString();
               }
            }
       }
    }
    //通过获取了城市自动调用天气数据申请
    get_weather(locat_city);
}

2)墨迹天气api

一般天气api有三种手动设置获取天气的方式 1、城市中心经纬度; 2、城市编码; 3、城市名。
个人认为城市名方便就以此为例,对应的为墨迹天气api;

http://autodev.openspeech.cn/csp/api/v2.1/weather?openId=aiuicus&clientType=android&sign=android&city=城市名&needMoreData=true&pageNo=1&pageSize=7

json返回数据如下

{
"code":0,
"msg":"操作成功",
"data":{
	"total":7,
	"sourceName":"墨迹天气",
	"list":[
			{
			"city":"成都",
			"lastUpdateTime":"2022-10-20 18:55:08",
			"date":"2022-10-20",
			"weather":"晴",
			"temp":22.0,
			"humidity":"45%",
			"wind":"北风1级",
			"pm25":58.0,
			"pm10":58.0,
			"low":14.0,
			"high":24.0,
			"airData":"58",
			"airQuality":"良",
			"dateLong":1666195200000,
			"weatherType":0,
			"windLevel":1,
			"province":"四川",
			"moreData":{
			"sunrise":"2022-10-20 07:09:00",
			"sunset":"2022-10-20 18:28:00",
			"precipitation":"0",
			"alert":null
}
},

上面的json数据不完整,本来会有未来七天的,篇幅有限只展示当天的

调用代码

void Widget::get_weather(QString city)
{

    QNetworkRequest request;
    request.setUrl(QUrl(QString("http://autodev.openspeech.cn/csp/api/v2.1/weather?"
                        "openId=aiuicus&clientType=android&sign=android&city=%1"
                        "&needMoreData=true&pageNo=1&pageSize=7").arg(city)));
    requst_weather->get(request);
}
void Widget::json_weather(QNetworkReply *reply)
{
    QString all = reply->readAll();
    QJsonDocument  Document;
    QJsonParseError json_error;
    QJsonDocument json_recv = QJsonDocument::fromJson(all.toUtf8(),&json_error);//解析json对象
    QJsonObject object = json_recv.object();
        if(object.contains("data"))
        {
           QJsonValue value = object.value("data");
           if(value.isObject())
           {
               QJsonObject object_1 = value.toObject();
               if(object_1.contains("list"))
               {
                   QJsonValue value_1 = object_1.value("list");
                   if(value_1.isArray())
                   {
                        for(int i=0; i<7; i++)
                        {
                            QJsonObject weather = value_1.toArray().at(i).toObject();
                            QString strdate = weather.value("date").toString();
                            date[i] = strdate.right(5);
                            weather_type[i] = weather.value("weather").toString();
                            temp[i] = weather.value("temp").toInt();
                            humidity[i] = weather.value("humidity").toString();
                            pm[i] = weather.value("pm25").toInt();
                            int low = weather.value("low").toInt();
                            int high = weather.value("high").toInt();
                            temp_range[i] = QString::number(low)+"~~"+QString::number(high)+"℃";
                            airData[i] = weather.value("airData").toString();
                            airQuality[i] = weather.value("airQuality").toString();
                            wind_type[i] = weather.value("wind").toString();
 
                        }
                   }
                }
           }
        }
}

3)json解析讲解

为了不重复造轮子,这里推荐一篇博客,看完基本上qt的json解析都可以掌握
QT json基本用法

4)调用代码

槽函数设置

//首先请求一个城市定位
    get_city(); 
//每一秒更新一下页面 
    timer_1 = new QTimer;
    connect(timer_1,SIGNAL(timeout()),this,SLOT(data_updata()));
    timer_1->start(1000);
//每300秒更新一下天气请求
    timer_2 = new QTimer;
    connect(timer_2,SIGNAL(timeout()),this,SLOT(get_city()));
    timer_2->start(300000);
    connect(requst_city, SIGNAL(finished(QNetworkReply*)), this, SLOT(json_city(QNetworkReply*)));
    connect(requst_weather, SIGNAL(finished(QNetworkReply*)), this, SLOT(json_weather(QNetworkReply*)));
//搜索其他城市
    connect(psearch,SIGNAL(clicked()),this,SLOT(seach_city()));
//手动定位当前城市,并刷新天气数据 
    connect(plocal, &QToolButton::clicked, [&](){ get_city(); });

界面数据更新代码

void Widget::data_updata()
{
       lab_city->setText(locat_city);
//拿到当前系统时间
       lab_date[0]->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd dddd"));
//这里是对天气图标的显示,如果打包需要把资源添加到项目中,我这里简单显示效果
       lab_weather_type_pic[0]->setPixmap(QPixmap(QString("C:\\Users\\Liu\\Desktop\\code\\QT\\QT_test\\test_city_weather\\img\\%1.png").arg(weather_type[0])));
       lab_wendu->setText(QString::number(temp[0]));
       lab_weather_type->setText(weather_type[0]);
       lab_temp_range[0]->setText(temp_range[0]);
//一些天气指数设置
       lab_wind->setText("风    向:"+wind_type[0]);
       lab_airD->setText("空气指数:"+airData[0]);
       lab_airQ->setText("空气质量:"+airQuality[0]);
       lab_pm->setText("PM2.5   :"+QString::number(pm[0]));
       lab_hum->setText("湿    度:"+humidity[0]);
//获取其他6天的天气情况
       for (int i=1;i<7;i++) {
           lab_weather_type_pic[i]->setPixmap(QPixmap(QString("C:\\Users\\Liu\\Desktop\\code\\QT\\QT_test\\test_city_weather\\img\\%1.png").arg(weather_type[i])));
           lab_temp_range[i]->setText(temp_range[i]);
           lab_date[i]->setText(date[i]);
       }
}

搜索其他城市

这里我写的简单,任意输入一个字符串都会搜索这不对的;
我们应该在这里要去判断输入城市名是否合法性,合法更新界面,不合法提示错误
感兴趣的朋友可以写一下

void Widget::seach_city()
{
    locat_city = lsearch->text();
    get_weather(locat_city);
    data_updata();
}

四、一些开发帮助

免费api网站 对于简单的练手api基本上是可以满足的
json解析 帮助小白把json数据格式化方便阅读和写解析代码

链接:https://pan.baidu.com/s/1YobgsTH0laDxH5aPGT1LUQ?pwd=tian
提取码:tian
目前 获取天气API链接失效了,大家可以换成百度,重写json解析就好了,思路可以借鉴

  • 9
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: c++ qt天气预报项目是一个基于qt框架的气象应用程序,主要功能是提供准确的天气信息查询服务。它具有直观的用户界面,可设置城市、天气、温度、湿度、气压等信息,还可显示未来几天的天气预报,方便用户随时了解天气情况。 在实现中,项目主要分为两个部分:前端和后端。前端主要负责展示数据和用户交互,使用qt的QML语言、JavaScript和CSS等技术进行布局和设计。后端主要负责实现数据的获取和处理,使用qtC++语言、网络通信和解析技术,从网络上获取数据,并进行解析与处理。 在该项目中,通过网络请求获得实时天气信息,如空气质量、温度、湿度、气压等,并根据用户设置的城市信息,显示对应的天气信息。同时,项目还提供城市搜索、切换、添加、删除等功能,并支持开机自启动。 此外,项目还包含了数据缓存和网络异常处理功能,当网络异常时,项目可以显示错误信息,并提示用户检查网络连接,保证用户能够正常使用。 总的来说,C++ qt天气预报项目是一款非常实用的天气应用程序,具有简单易用、界面美观、功能实用等特点,帮助用户时刻掌握天气情况,是一款非常实用和有用的工具。 ### 回答2: C++ Qt 天气预报项目是一个基于 Qt 框架开发的一款天气预报应用程序。该项目主要利用了 Qt 的 QWidget 和 QWebKit 组件来实现应用程序的界面和数据获取功能。在编写程序界面时,采用了 Qt Designer 工具进行设计,通过信号和槽机制实现用户交互和数据实时刷新。 该应用程序能够自动获取用户所在地区的天气信息,并展示当前天气情况、未来几天的天气预报等相关信息。在数据获取方面,通过 WebView 组件实现对天气网站的模拟访问,获取天气数据并进行解析和处理,最终将数据展示在界面上。 除了基本的天气信息展示功能外,该应用程序还具有自定义城市、多城市查询、背景图片更换等一些实用的功能。在多城市查询方面,用户可以添加多个城市进行查询,并支持切换城市信息。在背景图片更换方面,用户可以选择不同的背景主题,从而实现界面个性化定制。 在代码实现方面,该项目重点涉及信号和槽机制、数据处理和展示等方面的学习和应用。整个程序采用模块化架构,具有灵活性和可扩展性,非常适合初学者进行 Qt 编程练习。该项目还具有实际应用价值,能够帮助用户随时获取所在地区及其他城市的天气信息,使用户出行更加方便。 ### 回答3: C++ Qt 天气预报项目是一个使用C++ 编程语言,通过Qt GUI程序库和天气API开发的一款实用工具。它可以实现天气查询,每日天气信息的更新,城市切换、温度切换、语言切换等功能。 该项目的实现分为三个模块:天气API数据获取模块、天气信息处理模块和GUI界面设计与交互模块。天气API数据获取模块负责从API中获取天气数据,天气信息处理模块用于对天气数据进行处理, GUI界面设计与交互模块则主要实现用户界面的设计、功能按钮操作等。 在该项目的实现中,C++编程语言的高效性和良好的性能表现得到了充分的发挥。Qt GUI程序库提供了丰富的GUI组件和封装好的API,为项目开发提供了便利和支持。天气API的获取和处理模块为项目提供了可靠的数据来源和数据处理能力。 总的来说,C++ Qt 天气预报项目是一款实用、高效、易用的工具,为用户提供了便利的天气查询服务和多功能操作,同时也展示了C++编程语言Qt GUI程序库的优异特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值