#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…...
干货 | 探索CUTTag:从样本到文库,实验步步为营!
CUT&Tag(Cleavage Under Targets and Tagmentation)是一种新型DNA-蛋白互作研究技术,主要用于研究转录因子或组蛋白修饰在全基因组上的结合或分布位点。相比于传统的ChIP-seq技术,CUT&Tag反应在细胞内进行,创新…...
提质不增本,降本不降质
#公益巡讲# #质量万里行# 公开课、沙龙活动...
数据结构---顺序表实现
目录 1.顺序表 2.动态顺序表的实现 (4)顺序表初始化 (5)顺序表销毁 (6)顺序表的插入 a.尾插 b.头插 (7)顺序表的删除 a.尾删 b.头删 (8)指定位置之…...
python docx 添加动态表格
在Python中,使用python-docx库可以创建Word文档并添加动态表格。以下是一个简单的例子,演示如何创建一个包含动态内容的表格: from docx import Document# 创建一个Word文档 document Document()# 添加一个标题 document.add_heading(动态表…...
git配置多SSH
目的: 一台电脑可以让github、gitee等账号同时存在,让不同账号配置不同的密钥 第一步:创建不同平台的SSH公钥 执行命令: ssh-keygen -t rsa -C "对应仓库邮箱地址" -f ~/.ssh/id_rsa.github 如果执行上面的命令&…...
IDEA连接SqlServer数据库
目录 下载jar包 下载sqljdbc_12.6压缩包 解压 导入IDEA 新建文件夹 复制粘贴进JDBC文件夹并设为library 编写类及方法 代码 下载jar包 以sqljdbc_12.6为例 下载sqljdbc_12.6压缩包 最新地址:sqljdbc 官方最新地址 解压 解压即用 导入IDEA 新建文件夹 复制…...
LeetCode 378 有序矩阵中第K小的元素
题目信息 LeetoCode地址: . - 力扣(LeetCode) 题解内容大量转载于:. - 力扣(LeetCode) 题目理解 题意很直观,就是求二维矩阵中所有元素排序后第k小的数。 最小堆写法 该写法不再赘述,维护…...
Vue3(domdiff)最长递归子序列求解简易版(超简单)
Vue3(domdiff)最长递归子序列求解简易版 ⚠️ 关键词(每一个都需要理解)js 代码实现写完感想欢迎关注 ⚠️ 关键词(每一个都需要理解) 动态规划(O(N^2))(不提倡…...
LLaMA-Factory+qwen多轮对话微调
LLaMA-Factory地址:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md qwen地址:https://huggingface.co/Qwen/Qwen-7B-Chat/tree/main 数据准备 数据样例 [ {"id": "x3959", "conversations": [{&qu…...
邦芒面试:如何在面试中巧妙回答自己的缺点
在面试中,被问及自己的缺点时,如何巧妙回答是一门学问。恰当的回答不仅能够展示你的自我认知,还能让面试官看到你的成长潜力和积极态度。 首先,切忌谈一些看似缺点实则优点的话题,如追求完美、待人接物太客气等。这些…...
wordpress登录框透明/全国培训机构排名前十
序言新接触的项目中存在的大量的原生JDBC的代码,满屏幕都是PrepareStatement 和ResultSet,以及各种关闭资源的语句。所以有了用开源框架去重写的想法,然后就找到了JOOQ。JOOQ是什么?JOOQ是一款ORM框架。JOOQ的作用以及对比其他ORM…...
手表 网站策划/湖南优化电商服务有限公司
log4j2支持日志的异步打印,日志异步输出的好处在于,使用单独的进程来执行日志打印的功能,可以提高日志执行效率,减少日志功能对正常业务的影响。异步日志在程序的classpath需要加载disruptor-3.0.0.jar或者更高的版本。Asynchrono…...
html5个人网页代码大全/怎么优化标题和关键词排名
环境:   Visual Studio 2010 一、Mindscape.NhibernateModelDesigner安装   在打开VS2010之后,我们可以在“工具”菜单下找到“扩展管理器,搜索:Mindscape NHibernate Model Designer 下载安装即…...
56网站可以做电子相册/厦门seo推广外包
在用户空间,使用ioctl系统调用来控制设备,原型如下:int ioctl(int fd, unsigned long cmd, ...);第三个参数不表示一个变数目的参数,而是一个类型可选的参数。第三个参数依赖于控制命令。一些命令不用参数,一些用一个整…...
制造企业网站建设/怎么在百度上发布广告
1.存储器的层次结构 cpu内部的通用寄存器组,cpu内的Cache(高速缓存),cpu外部的Cache,主板上的主存储器,主板外的联机磁盘存储器及脱机存储器光盘存储器。 2.存储器的分类 1).按存储器所处的位置分类可分为…...
元谋网站建设/如何在百度上添加自己的店铺
su 切换到root用户,但是并没有转到root用户家目录下,即没有改变用户的环境。 su - 切换到root用户,并转到root用户的家目录下,即改变到了root用户的环境。 这个涉及到不同用户下的环境变量的配置。 sudo 通过sudo,我们…...