基于QT天气预报项目,推荐初学者练手 |
您所在的位置:网站首页 › 滕州天气预报实时播报 › 基于QT天气预报项目,推荐初学者练手 |
文章目录
前言本项目基于QT平台开发的一款天气预报,一个适合小白练手的项目。使用到了技术有HTTP编程、定位API、天气预报API、JSON解析,unicode转化为汉字。分享给大家一起讨论学习;
一、项目界面二、使用讲解三、相关功能实现1)百度ip定位apijson返回数据如下unicode码 转换 汉字调用代码
2)墨迹天气apijson返回数据如下调用代码
3)json解析讲解4)调用代码槽函数设置界面数据更新代码搜索其他城市
四、一些开发帮助
前言
本项目基于QT平台开发的一款天气预报,一个适合小白练手的项目。使用到了技术有HTTP编程、定位API、天气预报API、JSON解析,unicode转化为汉字。分享给大家一起讨论学习;
一、项目界面
界面没有选择UI布局,使用代码布局为了加深对QT的熟练,看个人爱好 二、使用讲解启动界面 QT的网络编程需要 添加一个network 大多数的天气api中不支持自动定位功能,需要手动的设置城市名称,但是这不符合我们实际生活的使用情况,所以在天气api之前我们还需要一个定位ip,这里我使用的是百度ip定位api 1)百度ip定位apihttps://api.map.baidu.com/location/ip?ak=您的AK&ip=您的IP&coor=bd09ll AK注册百度开发者平台就可获得 第一时间发现不懂,但是状态码表示正常,由于本人也是小白经验不足,也没有提示信息,在这如果觉得麻烦可以换成其他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返回数据 一般天气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; istart(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;isetPixmap(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解析就好了,思路可以借鉴 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |