#QT项目实战(天气预报)
1.IDE:QTCreator
2.实验:
3.记录:
(1)调用API的Url
a.调用API获取IP
whois.pconline.com.cn/ipJson.jsp?iphttp://whois.pconline.com.cn/ipJson.jsp?ip
if(window.IPCallBack) {IPCallBack({"ip":"123.147.249.72","pro":"重庆市","proCode":"500000","city":"重庆市","cityCode":"500000","region":"渝北区","regionCode":"500112","addr":"重庆市渝北区 铁通","regionNames":"","err":""});}
b.其他的API
太平洋网络IP地址查询Web接口 (pconline.com.cn)http://whois.pconline.com.cn/
whois.pconline.com.cn/ipJson.jsp?ip&level=3https://whois.pconline.com.cn/ipJson.jsp?ip&level=3
加上level=3后,获得的addr为重庆市渝北区,得不到铁通(level=3返回省市区)
if(window.IPCallBack) {IPCallBack({"ip":"123.147.249.72","pro":"重庆市","proCode":"500000","city":"重庆市","cityCode":"500000","region":"渝北区","regionCode":"500112","addr":"重庆市渝北区","regionNames":"","err":""});}
c.JSON格式校验
I.不加level的返回值拿去校验
可以发现不是JSON格式
II.指定JSON格式获得值拿去校验
whois.pconline.com.cn/ipJson.jsp?ip&json=truehttps://whois.pconline.com.cn/ipJson.jsp?ip&json=true
{"ip":"123.147.249.72","pro":"重庆市","proCode":"500000","city":"重庆市","cityCode":"500000","region":"渝北区","regionCode":"500112","addr":"重庆市渝北区 铁通","regionNames":"","err":""}
d.天气类API
I.心知天气API(需要密钥和城市拼音)
开发文档:
天气实况 | 心知天气文档 (seniverse.com)
请求示例:当天实时天气
II.中华万年历(只需要城市,不需要密钥)
已经失效......
(2)设计UI界面
(3) 编写代码
a.IP地址请求
I.网络请求回应管理类
QNetworkRequest,QNetworkReply,QNetworkManager
II.文本编码类
QTextCodeC
QNetworkReply *reply = (QNetworkReply *)sender();//可能会有多个函数连接到NetworkReply的信号finished上QTextCodec *codec = QTextCodec::codecForName("gbk");QString data=codec->toUnicode(reply->readAll());qDebug("%s",data.toStdString().data());
有可能多个Object的signal会连接到同一个signal(例如多个Button可能会connect到一个slot函数onClick()),因此这是就需要判断到底是哪个Object emit了这个signal,根据sender的不同来进行不同的处理
b.天气数据请求
I.心知天气访问当天实时天气示例
开发文档
天气实况 | 心知天气文档 (seniverse.com)
由于上面介绍的中华万年历已经失效,所以只能使用其他的API,这里我们使用心知天气的API
#include "widget.h"
#include "ui_widget.h"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
#include <QTextCodec>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);networkrmanager=new QNetworkAccessManager(this);// QNetworkRequest networkrequest;// networkrequest.setUrl(QUrl("https://whois.pconline.com.cn/ipJson.jsp?ip&json=true"));// QNetworkReply *networkreply=networkrmanager->get(networkrequest);// connect(networkreply,SIGNAL(finished()),this,SLOT(NetworkReplyFinished_Slot()));QNetworkRequest networkrequest;networkrequest.setUrl(QUrl("https://api.seniverse.com/v3/weather/now.json?key=自己的密钥&location=chongqing&language=en&unit=c"));QNetworkReply *weatherreply=networkrmanager->get(networkrequest);connect(weatherreply,SIGNAL(finished()),this,SLOT(WeatherReplyFinished_Slot()));
}Widget::~Widget()
{delete ui;
}
/*
//ip地址网络请求回应完成
void Widget::NetworkReplyFinished_Slot()
{QNetworkReply *reply = (QNetworkReply *)sender(); //可能会有多个函数连接到NetworkReply的信号finished上QTextCodec *codec = QTextCodec::codecForName("gbk"); //编码为gbkQString data=codec->toUnicode(reply->readAll());qDebug("%s",data.toStdString().data());reply->deleteLater(); //删除避免内存泄露int city_start = data.indexOf("city")+7;int city_end=data.indexOf("cityCode")-3;QString city_name=data.mid(city_start,city_end-city_start);qDebug()<<city_name;ui->location_txt->setText(city_name);//请求天气数据QNetworkRequest networkrequest;networkrequest.setUrl(QUrl("https://api.seniverse.com/v3/weather/now.json?key=SFeVqqT5EMlRWi6D0&location=chongqing&language=en&unit=c"));QNetworkReply *weatherreply=networkrmanager->get(networkrequest);connect(weatherreply,SIGNAL(finished()),this,SLOT(WeatherReplyFinished_Slot()));
}
*/
//获取天气
void Widget::WeatherReplyFinished_Slot()
{qDebug("hh");QNetworkReply *reply = (QNetworkReply *)sender(); //可能会有多个函数连接到NetworkReply的信号finished上QTextCodec *codec = QTextCodec::codecForName("gbk"); //编码为gbkQString data=codec->toUnicode(reply->readAll());qDebug("%s",data.toStdString().data());reply->deleteLater(); //删除避免内存泄露//查找城市int city_start = data.indexOf("name")+7;int city_end=data.indexOf("country")-3;QString city=data.mid(city_start,city_end-city_start);qDebug()<<city;ui->location_txt->setText(city);//查找天气int weather_start = data.indexOf("text")+7;int weather_end=data.indexOf("code")-3;QString weather=data.mid(weather_start,weather_end-weather_start);qDebug()<<weather;ui->weather_txt2->setText(weather);//查找温度int temperature_start = data.indexOf("temperature")+14;int temperature_end=data.indexOf("last_update")-4;QString temperature=data.mid(temperature_start,temperature_end-temperature_start);qDebug()<<temperature;ui->now_temperature_txt->setText(temperature);
}
在代码中我们获得了三个信息,第一个是城市,第二个是天气,第三个是温度
{"results": [{"location": {"id": "***********","name": "Chongqing","country": "CN","path": "Chongqing,Chongqing,China","timezone": "Asia/Shanghai","timezone_offset": "+08:00"},"now": {"text": "Cloudy","code": "4","temperature": "27"},"last_update": "2024-04-01T16:07:48+08:00"}]
}
运行效果:
II.心知天气连续几天天气获取示例
从昨天开始获取一直到未来三天
https://api.seniverse.com/v3/weather/daily.json?key=密钥&location=chongqing&language=zh-Hans&unit=c&start=-1&days=5
由于我们是免费用户,所以不能查询到昨日的天气信息。
c.关于解决编码问题-简体中文
上面第一次做出的界面为英文,我们获取的语言也是英文,我们后面把language改为zh-Hans(中文简体)更适合国人。修改编码为utf-8
d.使用心知天气连续访问几天天气的方式获取数据
从今天开始的五天(免费用户受限3天)
https://api.seniverse.com/v3/weather/daily.json?key=自己的密钥&location=chongqing&language=zh-Hans&unit=c&start=0&days=5
{"results": [{"location": {"id": "*********","name": "重庆","country": "CN","path": "重庆,重庆,中国","timezone": "Asia/Shanghai","timezone_offset": "+08:00"},"daily": [{"date": "2024-04-02","text_day": "多云","code_day": "4","text_night": "小雨","code_night": "13","high": "28","low": "19","rainfall": "0.69","precip": "0.36","wind_direction": "西北","wind_direction_degree": "315","wind_speed": "8.4","wind_scale": "2","humidity": "91"}, {"date": "2024-04-03","text_day": "小雨","code_day": "13","text_night": "中雨","code_night": "14","high": "27","low": "18","rainfall": "31.53","precip": "0.99","wind_direction": "西北","wind_direction_degree": "315","wind_speed": "8.4","wind_scale": "2","humidity": "87"}, {"date": "2024-04-04","text_day": "小雨","code_day": "13","text_night": "中雨","code_night": "14","high": "21","low": "17","rainfall": "8.35","precip": "0.79","wind_direction": "西","wind_direction_degree": "270","wind_speed": "3.0","wind_scale": "1","humidity": "91"}],"last_update": "2024-04-02T08:00:00+08:00"}]
}
(4)JSON格式解析
a.JSON格式
可以看到上面获得几天天气的API会返回一大串JSON格式数据,用我们上述的办法一个一个找非常麻烦,这个时候我们可以使用QT中的JSON类来解析。
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonDocument>
b.解析参考
Qt 常用JSON解析示例 - fengMisaka - 博客园 (cnblogs.com)https://www.cnblogs.com/linuxAndMcu/p/13040194.html
c.编写解析代码
QJsonParseError jsonparseerror;QJsonDocument jsondocument;QJsonObject jsonobject;jsondocument = QJsonDocument::fromJson(data.toUtf8().data(),&jsonparseerror);if((jsonparseerror.error==QJsonParseError::NoError)&&(jsondocument.isEmpty()==false)) //判断是否解析成功{qDebug("成功");if(jsondocument.isObject()){jsonobject=jsondocument.object();QJsonValue resultsvalue=jsonobject.value("results"); //results是一个对象,得到它的值QJsonObject resultobject=resultsvalue.toArray().at(0).toObject(); //将results数组里面的第一个元素作为对象//解析last_updateQString last_update=resultobject.value("last_update").toString();qDebug()<<last_update;//解析地址QJsonObject locationobject=resultobject.value("location").toObject(); //将location作为对象QString location=locationobject.value("name").toString(); //将location对象里面的name的值取出来(转换为string)ui->location_txt->setText(location); //设置地址qDebug()<<location; //打印location//解析日期以及天气QJsonValue dailyvalue=resultobject.value("daily");QJsonArray dailyarray=dailyvalue.toArray();//qDebug()<<dailyarray.size(); //打印数组的个数QString weather[3]; //天气QString date[3]; //日期QString high_temprature[3]; //最高温QString low_temprature[3]; //最低温QString humidity[3]; //湿度for(int i=0;i<dailyarray.size();i++){QJsonObject jsob=dailyarray.at(i).toObject(); //数组转换为JSON对象weather[i]=jsob.value("text_day").toString(); //获取天气date[i]=jsob.value("date").toString(); //获取日期high_temprature[i]=jsob.value("high").toString(); //获取最高温low_temprature[i]=jsob.value("low").toString(); //获取最低温humidity[i]=jsob.value("humidity").toString(); //获取湿度qDebug()<<weather[i];}
(5)QT解析JSON数据的方法
a.体系结构
[]代表的是数组,{}代表的是对象,从最外层开始一层一层往里面剥开,最外层始终是一个"{}"。最重要的就是分清对象和数组。有"[]"数组则使用QJsonArray将其转换为QJson数组,当没有"[]"即数组时最简单。我们主要操控Object。
b.把整个JSON文本转换用的是QJsonDocument。
需要注意检验文本是否是正确的QJson格式,这里推荐先使用网上的在线工具,比如Be Json
在线JSON校验格式化工具(Be JSON)https://www.bejson.com/
c.综合详解
以上面的心知天气返回的JSON为例:
I.先用QJsonDocument转换的文本转换给一个QJsonObject
QJsonParseError jsonparseerror;QJsonDocument jsondocument;QJsonObject jsonobject;jsondocument = QJsonDocument::fromJson(data.toUtf8().data(),&jsonparseerror);if((jsonparseerror.error==QJsonParseError::NoError)&&(jsondocument.isEmpty()==false)) //判断是否解析成功{qDebug("成功");if(jsondocument.isObject()){jsonobject=jsondocument.object();
II.用QJsonObject.value提取results将其转换为QJsonObject
QJsonValue resultsvalue=jsonobject.value("results"); //results是一个对象,得到它的值
III.此时紧接着就是一个"["说明这是一个数组,然后由"{"囊括一直到last_update后面才有一个"}"结束囊括紧跟的就是"]",说明这个results数组只有一个元素。
IIII.将results转换为QJsonArray数组并且取下标为0的值转换为QJsonObject(因为数组下标从0开始,并且只有一个元素)
QJsonObject resultobject=resultsvalue.toArray().at(0).toObject();
IIIII.此时results下标为0的对象(resultobject)中有三个元素"location"、"daily"、"last_update",因为location以及daily内部都有很多内容,所以我们先提取最简单的"last_update"
IIIIII.此时可直接用resultobject.value("last_update")提取last_update的值。
QString last_update=resultobject.value("last_update").toString();
qDebug()<<last_update;
IIIIIII.再看location,用resultobject.value("location").toObject转换为QJsonObject(locationobject),再将用location.value("").tostring将想要的值提出来。
QJsonObject locationobject=resultobject.value("location").toObject(); //将location作为对象
QString location=locationobject.value("name").toString(); //将location对象里面的name的值取出来(转换为string)
qDebug()<<location; //打印location
IIIIIIII.再看daily,[],说明是数组,但是它有三个元素"{},{},{}",遇到数组将其转换为QJsonArray
QJsonArray dailyarray=resultobject.value("daily").toArray();
再将Array的下标值转换为对象,再获取数据
for(int i=0;i<dailyarray.size();i++){QJsonObject jsob=dailyarray.at(i).toObject(); //数组转换为JSON对象weather[i]=jsob.value("text_day").toString(); //获取天气date[i]=jsob.value("date").toString(); //获取日期high_temprature[i]=jsob.value("high").toString(); //获取最高温low_temprature[i]=jsob.value("low").toString(); //获取最低温humidity[i]=jsob.value("humidity").toString(); //获取湿度qDebug()<<weather[i];}
至此获取所有数据完毕。
(6)UI界面数据加载以及天气图标切换
//设置界面数据ui->humidity1->setText(humidity[0]);ui->humidity2->setText(humidity[1]);ui->humidity3->setText(humidity[2]);ui->today->setText(date[0]);ui->tomorrow->setText(date[1]);ui->dayaftertomorrow->setText(date[2]);ui->weather_txt1->setText(weather[0]);ui->weather_txt2->setText(weather[1]);ui->weather_txt3->setText(weather[2]);ui->temprature_txt1->setText(low_temprature[0]+'/'+high_temprature[0]);ui->temprature_txt2->setText(low_temprature[1]+'/'+high_temprature[1]);ui->temprature_txt3->setText(low_temprature[2]+'/'+high_temprature[2]);//更改图标if(weather[0]=="多云"){QString pic(":/pic/pic/multicloud.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img1->height(),ui->weather_img1->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img1->setPixmap(pixmap);}else if(weather[0]=="小雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img1->height(),ui->weather_img1->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img1->setPixmap(pixmap);}else if(weather[0]=="大雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img1->height(),ui->weather_img1->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img1->setPixmap(pixmap);}else if(weather[0]=="阴"){QString pic(":/pic/pic/cloudy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img1->height(),ui->weather_img1->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img1->setPixmap(pixmap);}else if(weather[0]=="晴"){QString pic(":/pic/pic/sunny.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img1->height(),ui->weather_img1->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img1->setPixmap(pixmap);}
//if(weather[1]=="多云"){QString pic(":/pic/pic/multicloud.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img2->height(),ui->weather_img2->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img2->setPixmap(pixmap);}else if(weather[1]=="小雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img2->height(),ui->weather_img2->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img2->setPixmap(pixmap);}else if(weather[1]=="大雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img2->height(),ui->weather_img2->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img2->setPixmap(pixmap);}else if(weather[1]=="阴"){QString pic(":/pic/pic/cloudy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img2->height(),ui->weather_img2->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img2->setPixmap(pixmap);}else if(weather[1]=="晴"){QString pic(":/pic/pic/sunny.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img2->height(),ui->weather_img2->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img2->setPixmap(pixmap);}
//if(weather[2]=="多云"){QString pic(":/pic/pic/multicloud.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img3->height(),ui->weather_img3->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img3->setPixmap(pixmap);}else if(weather[2]=="小雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img3->height(),ui->weather_img3->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img3->setPixmap(pixmap);}else if(weather[2]=="大雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img3->height(),ui->weather_img3->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img3->setPixmap(pixmap);}else if(weather[2]=="阴"){QString pic(":/pic/pic/cloudy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img3->height(),ui->weather_img3->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img3->setPixmap(pixmap);}else if(weather[2]=="晴"){QString pic(":/pic/pic/sunny.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img3->height(),ui->weather_img3->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img3->setPixmap(pixmap);}
(7)实时刷新数据(使用一个定时器来定时获取数据)
//定时器溢出事件
void Widget::timeout_slot()
{counter++;//10秒更新一次时间信息if((counter%2==0)&&(counter!=60)){QNetworkRequest networkrequest;networkrequest.setUrl(QUrl("https://quan.suning.com/getSysTime.do"));QNetworkReply *timereply=networkrmanager->get(networkrequest);connect(timereply,SIGNAL(finished()),this,SLOT(TimeReplyFinished_Slot()));}//5分钟获取一次天气数据else if(counter==60){counter=0;QNetworkRequest networkrequest;networkrequest.setUrl(QUrl("https://api.seniverse.com/v3/weather/daily.json?key=用户密钥&location=chongqing&language=zh-Hans&unit=c&start=0&days=5"));QNetworkReply *weatherreply=networkrmanager->get(networkrequest);connect(weatherreply,SIGNAL(finished()),this,SLOT(WeatherReplyFinished_Slot()));}
}
(8)最终运行效果(UI有修改)
4.代码
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
#include <QTextCodec>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonDocument>
#include <QStringLiteral>
#include <QJsonArray>
#include <QPixmap>
#include <QTimer>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);networkrmanager=new QNetworkAccessManager(this);QNetworkRequest networkrequest;//当日的天气// networkrequest.setUrl(QUrl("https://api.seniverse.com/v3/weather/now.json?key=用户密钥&location=chongqing&language=zh-Hans&unit=c"));//连续几日的天气networkrequest.setUrl(QUrl("https://api.seniverse.com/v3/weather/daily.json?key=用户密钥&location=chongqing&language=zh-Hans&unit=c&start=0&days=5"));QNetworkReply *weatherreply=networkrmanager->get(networkrequest);connect(weatherreply,SIGNAL(finished()),this,SLOT(WeatherReplyFinished_Slot()));timer_5s.start(5000);connect(&timer_5s,SIGNAL(timeout()),this,SLOT(timeout_slot()));}Widget::~Widget()
{delete ui;
}//获取天气
void Widget::WeatherReplyFinished_Slot()
{QNetworkReply *reply = (QNetworkReply *)sender(); //可能会有多个函数连接到NetworkReply的信号finished上QTextCodec *codec = QTextCodec::codecForName("utf-8"); //编码为gbkQString data=codec->toUnicode(reply->readAll());qDebug("%s",data.toStdString().data());reply->deleteLater(); //删除避免内存泄露// //查找城市// int city_start = data.indexOf("name")+7;// int city_end=data.indexOf("country")-3;// QString city=data.mid(city_start,city_end-city_start);// // qDebug()<<city;// ui->location_txt->setText(city);// //查找天气// int weather_start = data.indexOf("text")+7;// int weather_end=data.indexOf("code")-3;// QString weather=data.mid(weather_start,weather_end-weather_start);// // qDebug()<<weather;// ui->weather_txt1->setText(weather);// //查找温度// int temperature_start = data.indexOf("temperature")+14;// int temperature_end=data.indexOf("last_update")-4;// QString temperature=data.mid(temperature_start,temperature_end-temperature_start);// // qDebug()<<temperature;// ui->now_temperature_txt->setText(temperature);QJsonParseError jsonparseerror;QJsonDocument jsondocument;QJsonObject jsonobject;jsondocument = QJsonDocument::fromJson(data.toUtf8().data(),&jsonparseerror);if((jsonparseerror.error==QJsonParseError::NoError)&&(jsondocument.isEmpty()==false)) //判断是否解析成功{qDebug("成功");if(jsondocument.isObject()){jsonobject=jsondocument.object();QJsonValue resultsvalue=jsonobject.value("results"); //results是一个对象,得到它的值QJsonObject resultobject=resultsvalue.toArray().at(0).toObject(); //将results数组里面的第一个元素作为对象//解析last_updateQString last_update=resultobject.value("last_update").toString();qDebug()<<last_update;//解析地址QJsonObject locationobject=resultobject.value("location").toObject(); //将location作为对象QString location=locationobject.value("name").toString(); //将location对象里面的name的值取出来(转换为string)ui->location_txt->setText(location); //设置地址qDebug()<<location; //打印location//解析日期以及天气QJsonArray dailyarray=resultobject.value("daily").toArray();//qDebug()<<dailyarray.size(); //打印数组的个数QString weather[3]; //天气QString date[3]; //日期QString high_temprature[3]; //最高温QString low_temprature[3]; //最低温QString humidity[3]; //湿度for(int i=0;i<dailyarray.size();i++){QJsonObject jsob=dailyarray.at(i).toObject(); //数组转换为JSON对象weather[i]=jsob.value("text_day").toString(); //获取天气date[i]=jsob.value("date").toString(); //获取日期high_temprature[i]=jsob.value("high").toString(); //获取最高温low_temprature[i]=jsob.value("low").toString(); //获取最低温humidity[i]=jsob.value("humidity").toString(); //获取湿度qDebug()<<weather[i];}//设置界面数据ui->humidity1->setText(humidity[0]);ui->humidity2->setText(humidity[1]);ui->humidity3->setText(humidity[2]);ui->today->setText(date[0]);ui->tomorrow->setText(date[1]);ui->dayaftertomorrow->setText(date[2]);ui->weather_txt1->setText(weather[0]);ui->weather_txt2->setText(weather[1]);ui->weather_txt3->setText(weather[2]);ui->temprature_txt1->setText(low_temprature[0]+'/'+high_temprature[0]);ui->temprature_txt2->setText(low_temprature[1]+'/'+high_temprature[1]);ui->temprature_txt3->setText(low_temprature[2]+'/'+high_temprature[2]);//更改图标if(weather[0]=="多云"){QString pic(":/pic/pic/multicloud.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img1->height(),ui->weather_img1->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img1->setPixmap(pixmap);}else if(weather[0]=="小雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img1->height(),ui->weather_img1->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img1->setPixmap(pixmap);}else if(weather[0]=="大雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img1->height(),ui->weather_img1->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img1->setPixmap(pixmap);}else if(weather[0]=="阴"){QString pic(":/pic/pic/cloudy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img1->height(),ui->weather_img1->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img1->setPixmap(pixmap);}else if(weather[0]=="晴"){QString pic(":/pic/pic/sunny.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img1->height(),ui->weather_img1->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img1->setPixmap(pixmap);}
//if(weather[1]=="多云"){QString pic(":/pic/pic/multicloud.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img2->height(),ui->weather_img2->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img2->setPixmap(pixmap);}else if(weather[1]=="小雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img2->height(),ui->weather_img2->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img2->setPixmap(pixmap);}else if(weather[1]=="大雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img2->height(),ui->weather_img2->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img2->setPixmap(pixmap);}else if(weather[1]=="阴"){QString pic(":/pic/pic/cloudy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img2->height(),ui->weather_img2->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img2->setPixmap(pixmap);}else if(weather[1]=="晴"){QString pic(":/pic/pic/sunny.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img2->height(),ui->weather_img2->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img2->setPixmap(pixmap);}
//if(weather[2]=="多云"){QString pic(":/pic/pic/multicloud.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img3->height(),ui->weather_img3->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img3->setPixmap(pixmap);}else if(weather[2]=="小雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img3->height(),ui->weather_img3->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img3->setPixmap(pixmap);}else if(weather[2]=="大雨"){QString pic(":/pic/pic/rainy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img3->height(),ui->weather_img3->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img3->setPixmap(pixmap);}else if(weather[2]=="阴"){QString pic(":/pic/pic/cloudy.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img3->height(),ui->weather_img3->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img3->setPixmap(pixmap);}else if(weather[2]=="晴"){QString pic(":/pic/pic/sunny.png");QPixmap pixmap(pic);pixmap=pixmap.scaled(ui->weather_img3->height(),ui->weather_img3->width(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation);ui->weather_img3->setPixmap(pixmap);}//时间请求QNetworkRequest networkrequest;networkrequest.setUrl(QUrl("https://quan.suning.com/getSysTime.do"));QNetworkReply *timereply=networkrmanager->get(networkrequest);connect(timereply,SIGNAL(finished()),this,SLOT(TimeReplyFinished_Slot()));}}
}//时间请求相应
void Widget::TimeReplyFinished_Slot()
{QNetworkReply *reply = (QNetworkReply *)sender(); //可能会有多个函数连接到NetworkReply的信号finished上QTextCodec *codec = QTextCodec::codecForName("utf-8"); //编码为gbkQString data=codec->toUnicode(reply->readAll());qDebug("%s",data.toStdString().data());reply->deleteLater(); //删除避免内存泄露int Date_start;int Date_end;int hour_start;int hour_end;int min_start;int min_end;int sec_start;int sec_end;Date_start=data.indexOf("sysTime2")+11;Date_end=data.indexOf("sysTime1")-12;QString Date=data.mid(Date_start,Date_end-Date_start);//qDebug()<<Date;hour_start=data.indexOf("sysTime2")+22;hour_end=data.indexOf("sysTime1")-9;QString hour=data.mid(hour_start,hour_end-hour_start);//qDebug()<<hour;min_start=data.indexOf("sysTime2")+25;min_end=data.indexOf("sysTime1")-6;QString min=data.mid(min_start,min_end-min_start);//qDebug()<<min;sec_start=data.indexOf("sysTime2")+28;sec_end=data.indexOf("sysTime1")-3;QString sec=data.mid(sec_start,sec_end-sec_start);//qDebug()<<sec;ui->Date_txt->setText(Date);ui->time_hour->display(hour);ui->time_min->display(min);ui->time_sec->display(sec);
}//定时器溢出事件
void Widget::timeout_slot()
{counter++;//10秒更新一次时间信息if((counter%2==0)&&(counter!=60)){QNetworkRequest networkrequest;networkrequest.setUrl(QUrl("https://quan.suning.com/getSysTime.do"));QNetworkReply *timereply=networkrmanager->get(networkrequest);connect(timereply,SIGNAL(finished()),this,SLOT(TimeReplyFinished_Slot()));}//5分钟获取一次天气数据else if(counter==60){counter=0;QNetworkRequest networkrequest;networkrequest.setUrl(QUrl("https://api.seniverse.com/v3/weather/daily.json?key=用户密钥&location=chongqing&language=zh-Hans&unit=c&start=0&days=5"));QNetworkReply *weatherreply=networkrmanager->get(networkrequest);connect(weatherreply,SIGNAL(finished()),this,SLOT(WeatherReplyFinished_Slot()));}
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QNetworkAccessManager>
#include <QTimer>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();QNetworkAccessManager *networkrmanager;QTimer timer_5s;int counter=0;
private:Ui::Widget *ui;public slots:void WeatherReplyFinished_Slot();void timeout_slot();void TimeReplyFinished_Slot();
};
#endif // WIDGET_H
相关文章:

#QT项目实战(天气预报)
1.IDE:QTCreator 2.实验: 3.记录: (1)调用API的Url a.调用API获取IP whois.pconline.com.cn/ipJson.jsp?iphttp://whois.pconline.com.cn/ipJson.jsp?ip if(window.IPCallBack) {IPCallBack({"ip":&quo…...

数据挖掘|关联分析与Apriori算法详解
数据挖掘|关联分析与Apriori算法 1. 关联分析2. 关联规则相关概念2.1 项目2.2 事务2.3 项目集2.4 频繁项目集2.5 支持度2.6 置信度2.7 提升度2.8 强关联规则2.9 关联规则的分类 3. Apriori算法3.1 Apriori算法的Python实现3.2 基于mlxtend库的Apriori算法的Python实现 1. 关联分…...
ChatGPT Excel 大师
原文:ChatGPT Excel Mastery 译者:飞龙 协议:CC BY-NC-SA 4.0 序言 欢迎来到 Excel 掌握的变革之旅,在这里,尖端技术和永恒专业知识在“ChatGPT Excel 掌握:释放专家技巧和窍门的力量”中融合。在当今快节…...
C 语言中的 end, _end 符号
使用 man 3 end 可以看到相关符号的解释 这些符号不是在 C 语言文件和头文件中定义的,它们是 ld 在链接所有 .o 文件的时候自己添加的。 end 和 _end 的地址,就是最终程序的堆的起始地址 要打印它们的话,一个样例程序在下面: …...

绿联 安装PDF工具
这是一个强大的本地托管的基于 Web 的 PDF 操作工具,使用 docker,允许您对 PDF 文件执行各种操作,例如拆分、合并、转换、重组、添加图像、旋转、压缩等。这个本地托管的 Web 应用程序最初是 100% ChatGPT 制作的应用程序,现已发展…...

备战蓝桥杯---数论相关问题
目录 一、最大公约数和最小公倍数 二、素数判断 三、同余 四、唯一分解定理 五、约数个数定理 六、约数和定理 五、快速幂 六、费马小定理 七、逆元 一、最大公约数和最小公倍数 文章链接:最大公约数和最小公倍数 二、素数判断 文章链接:在J…...

苹果手表Apple Watch录了两个半小时的录音,却只能播放4秒,同步到手机也一样,还能修复好吗?
好多人遇到这个情况,用苹果手表Apple Watch录音,有的录1个多小时,有的录了3、4小时,甚至更长时间,因为手表没电,忘记保存等原因造成录音损坏,都是只能播放4秒,同步到手机也一样&…...

RGB三通道和灰度值的理解
本文都是来自于chatGPT的回答!!! 目录 Q1:像素具有什么属性?Q2:图像的色彩是怎么实现的?Q3:灰度值和颜色值是一个概念吗?Q4:是不是像素具有灰度值,也有三个颜色分量RGB?Q5:灰度图像是没有色彩的吗?Q6: 彩色图像是既具有灰度值也具有RGB三…...

ARM、X86、RISC-V三分天下
引入: 简单的介绍一下X86、ARM、RISC-V三种cpu架构的区别和应用场景。 目录 简单概念讲解 1. X86架构 2. ARM架构 3. RISC-V架构 应用场景 X86、ARM和RISC-V是三种不同的CPU架构,它们在设计理念、指令集和应用场景上有一些区别。 简单概念讲解 1. X…...

力控机器人原理及力控制实现
力控机器人原理及力控制实现 力控机器人是一种能够感知力量并具有实时控制能力的机器人系统。它们可以在与人类进行精准协作和合作时,将力传感技术(Force Sensing Technology)和控制算法(Control Algorithm)结合起来&a…...
最小生成树
最小生成树问题是指给定一个带权的无向图,删除一些边使得这个无向图变成一棵树,并且权值之和最小。 解决此类问题的方法主要有两种:Prim算法,Kruskal算法 Prim 算法 从一个点开始,逐步扩展,每次选择权值…...

二维动画制作软件 Animate 2024 for mac激活版
Animate 2024 for Mac是一款功能强大的二维动画制作软件,专为Mac用户打造。它提供了丰富的动画编辑功能,使用户能够轻松创建出生动逼真的动画作品。无论是短片、广告还是游戏等应用领域,Animate 2024都能发挥出出色的表现。 软件下载…...
相对论中关于光速不变理解的补充
近几个月在物理直播间聊爱因斯坦相对论,发现好多人在理解爱因斯坦相对论关于基本假设,普遍认为光速是不变的,质能方程 中光速的光速不变的,在这里我对这个假设需要做一个补充,他是基于质能方程将光速C 在真是光速变化曲…...

面试(04)————JavaWeb
1、网络通讯部分 1.1、 TCP 与 UDP 区别? 1.2、什么是 HTTP 协议? 1.3、TCP 的三次握手,为什么? 1.4、HTTP 中重定向和请求转发的区别? 1.5、 Get 和 Post 的区别? 2、cookie 和 session 的区别&am…...

Debian12 使用 nginx 与 php8.2 使用 Nextcloud
最近将小服务器升级了下系统,使用了 debian12 的版本,正好试试 nginx 和 php-fpm 这种方式运行 Nextcloud 这个私有云的配置。 一、基本系统及应用安装 系统:debian12 x86_64 位版本最小安装,安装后可根据自己需求安装一些工具&…...

Java设计模式:代理模式的静态和动态之分(八)
码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 在软件设计中,代理模式是一种常用的设计模式,它为我们提供了一种方式来控制对原始对象的访问。在Java中&a…...

【论文通读】AgentStudio: A Toolkit for Building General Virtual Agents
AgentStudio: A Toolkit for Building General Virtual Agents 前言AbstractMotivationFramework评估GUI GroudingReal-World Cross-Application Benchmark Suite Conclusion 前言 来自昆仑万维的一篇智能体环境数据大一统框架工作,对未来计算机智能体的发展具有指…...
wordvect嵌入和bert嵌入的区别
Word2Vec 嵌入和 BERT 嵌入之间有几个关键区别: 训练方式: Word2Vec:Word2Vec 是一个基于神经网络的词嵌入模型,它通过训练一个浅层的神经网络来学习单词的分布式表示。它有两种训练方式:连续词袋模型(CBOW…...

渗透测试练习题解析 5(CTF web)
1、[安洵杯 2019]easy_serialize_php 1 考点:PHP 反序列化逃逸 变量覆盖 【代码审计】 通过 GET 的方式获取参数 f 的值,传递给变量 function 定义一个过滤函数,过滤掉特定字符(用空字符替换) 下面的代码其实没什么用…...

PCA(Principal Component Analysis,主成分分析)
PCA(Principal Component Analysis,主成分分析)是一种在数据分析中广泛应用的统计方法,主要用于数据降维、可视化和去噪。以下是对PCA的发展史、工作原理以及理论基础的详细解释: Principal Component Analysis 一、PC…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...