#QT项目实战(天气预报)

news2024/10/5 19:19:53

1.IDE:QTCreator


2.实验:


3.记录:

(1)调用API的Url

a.调用API获取IP

whois.pconline.com.cn/ipJson.jsp?ipicon-default.png?t=N7T8http://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)icon-default.png?t=N7T8http://whois.pconline.com.cn/
whois.pconline.com.cn/ipJson.jsp?ip&level=3icon-default.png?t=N7T8https://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=trueicon-default.png?t=N7T8https://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"); //编码为gbk
    QString 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"); //编码为gbk
    QString 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)icon-default.png?t=N7T8https://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_update
        QString 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)icon-default.png?t=N7T8https://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"); //编码为gbk
    QString 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_update
        QString 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"); //编码为gbk
    QString 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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1573831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python学习之-魔术方法

前言&#xff1a; Python 中的魔术方法&#xff08;Magic Methods&#xff09;&#xff0c;也称作特殊方法&#xff08;Special Methods&#xff09;&#xff0c;是那些被双下划线包围的方法&#xff0c;例如 init。这些方法在 Python 中有特殊的含义&#xff0c;它们并不需要…

ThingsBoard通过MQTT发送遥测数据

MQTT基础 客户端 MQTT连接 遥测上传API 案例 MQTT基础 MQTT是一种轻量级的发布-订阅消息传递协议&#xff0c;它可能最适合各种物联网设备。 你可以在此处找到有关MQTT的更多信息&#xff0c;ThingsBoard服务器支持QoS级别0&#xff08;最多一次&#xff09;和QoS级别1&…

程序猿成长之路之数据挖掘篇——频繁项集挖掘介绍

频繁项集挖掘可以说是数据挖掘中的重点&#xff0c;下面我们来分析以下频繁项集挖掘的过程和目标 如果对数据挖掘没有概念的小伙伴可以查看上次的文章 https://blog.csdn.net/qq_31236027/article/details/137046475 什么是频繁项集&#xff1f; 在回答这个问题之前&#xff…

蓝桥杯第101题 拉马车 C++ Java Python

目录 题目 思路和解题方法 复杂度: c 代码 Java 版本&#xff08;仅供参考&#xff09; Python 版本&#xff08;仅供参考&#xff09; 代码细节 C 版本: Java 版本: Python 版本: 题目 思路和解题方法 这个游戏是一个简单的纸牌游戏&#xff0c;两个玩家轮流出牌&am…

Springboot相关知识-图片描述(学习笔记)

学习java过程中的一些笔记&#xff0c;觉得比较重要就顺手记录下来了~ 目录 一、前后端请求1.前后端交互2.简单传参3.数组集合传参4.日期参数5.Json参数6.路径参数7.响应数据8.解析xml文件9.统一返回类10.三层架构11.分层解耦12.Bean的声明13.组件扫描14.自动注入 一、前后端请…

(免费分享)基于springboot,vue问卷调查系统

用户注册、用户登录、创建调查问卷、编辑问卷问题和选型&#xff08;支持题型&#xff1a;单选、多选、单行文本、多行文本、数字、评分、日期、文本描述&#xff09;、保存和发布问卷、停止问卷调查、游客填写调查问卷&#xff08;一个IP地址只能填写一次&#xff09; 技术&a…

4.3 IO day5

1&#xff1a;实现文件夹的拷贝功能 注意判断被拷贝的文件夹是否存在&#xff0c;如果不存在则提前创建&#xff0c;创建文件夹的函数为 mkdir 不考虑递归拷贝的问题 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h…

蓝桥杯刷题-09-三国游戏-贪心⭐⭐⭐

蓝桥杯2023年第十四届省赛真题-三国游戏 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i 个事件发生时会分别让 X, Y,…

清明作业 c++

1.封装一个类&#xff0c;实现对一个数求累和阶乘质数 #include <iostream>using namespace std; int mproduct(int a){if(a>1){return a*mproduct((a-1));}else{return 1;} } class number{int a; public:number():a(5){};number(int a):a(a){}void set(int a){thi…

开源的页面生成器:拖拽即可生成小程序、H5页面和网站

星搭精卫 MtBird 是一款低代码可视化页面生成器&#xff0c;可以帮助用户以可视化的形式搭建网页、小程序和表单等应用。 使用这个生成器&#xff0c;不需要代码就可以生成小程序、H5页面和网站&#xff0c;拖拽操作、样式配置快速生成页面应用&#xff0c;数据可视化接入&…

2024年【道路运输企业安全生产管理人员】找解析及道路运输企业安全生产管理人员作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业安全生产管理人员找解析参考答案及道路运输企业安全生产管理人员考试试题解析是安全生产模拟考试一点通题库老师及道路运输企业安全生产管理人员操作证已考过的学员汇总&#xff0c;相对有效帮助道路运输…

C++高频面试知识总结 part3

哈希 1.哈希表为什么快&#xff1f;2.哈希冲突解决方法3.哈希表扩容流程4.哈希表扩容太多次&#xff0c;需要遍历所有元素&#xff0c;如何优化&#xff1f;5.渐进式扩容为何可以正确访问哈希表&#xff1f; 1.哈希表为什么快&#xff1f; 哈希表&#xff08;Hash table&#…

告别旧IP,更换网络ip地址教程分享

在数字化世界中&#xff0c;IP地址作为每个网络设备的标识符&#xff0c;扮演着至关重要的角色。它不仅是设备在网络中的“门牌号”&#xff0c;还影响着网络连接的稳定性、安全性和数据传输效率。因此&#xff0c;在某些情况下&#xff0c;更换网络IP地址成为必要操作。虎观代…

平台规则的改变会影响低价治理结果吗

许多品牌在做低价链接投诉时&#xff0c;会用一套自己的标准去做&#xff0c;但如果无视平台规则&#xff0c;会出现非常多不好的结果&#xff0c;比如帐号投诉成功率被拉低&#xff0c;会直接影响后续链接的投诉时效和成功率&#xff0c;同时因为不尊重平台规则&#xff0c;而…

美国洛杉矶大带宽服务器带宽堵塞解决方法

随着互联网的快速发展&#xff0c;大带宽服务器成为了现代企业和个人进行数据传输、存储和处理的关键设施。然而&#xff0c;在美国洛杉矶等大城市&#xff0c;由于网络流量的激增、不合理的网络配置以及网络攻击等多种原因&#xff0c;大带宽服务器带宽堵塞问题日益凸显。本文…

【力扣】94. 二叉树的中序遍历、144. 二叉树的前序遍历、145. 二叉树的后序遍历

先序遍历&#xff1a;根-左-右中序遍历&#xff1a;左-根-右后序遍历&#xff1a;左-右-根 94. 二叉树的中序遍历 题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3…

基于springboot+vue+Mysql的教学视频点播系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

洛谷 1126.机器人搬重物

思路&#xff1a;BFS 这道BFS可谓是细节爆炸&#xff0c;对于编程能力和判断条件的能力的考察非常之大。 对于这道题&#xff0c;我们还需要额外考虑一些因素&#xff0c;那就是对于障碍物的考虑和机器人方位的考虑。 首先我们看第一个问题&#xff0c;就是对于障碍物的考虑…

Qt Creator 界面

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、认识 Qt Creator 界面 1、总览 2、左边栏 3、代码编辑区 4、UI设计界面 5、构建区 一、认识 …

GitHub入门与实践

ISBN: 978-7-115-39409-5 作者&#xff1a;【日】大塚弘记 译者&#xff1a;支鹏浩、刘斌 页数&#xff1a;255页 阅读时间&#xff1a;2023-08-05 推荐指数&#xff1a;★★★★★ 好久之前读完的了&#xff0c;一直没有写笔记。 这本入门Git的书籍还是非常推荐的&#xff0c;…