【QT】基于HTTP通信的天气查询的实现

目录

 

设计目标

效果展示

实现过程

http通信

Json格式数据解析

UI设计

源码


设计目标

1、用Qt网络编程实现天气查询显示

2、使用免费天气API :http://t.weather.sojson.com/api/weather/city/城市id

北京 101010100
武汉 101200101
襄阳 101200201
广州 101280101

3、自己搭建apache服务器

效果展示

实现过程

http通信

1. http客户端

    (1) 创建套接字--与服务器建立连接

    (2)向服务器发送http请求数据(http头, 请求数据

              http头:GET / HTTP/1.1\r\nHost: 192.168.12.2:9090/index.html   \r\nConnection: Keep-Alive\r\n

    (3) 如果请求是合法,服务器会返回请求的数据

2、Qt中http通信

#include <QNetworkAccessManager>

--管理整个http通信负责发送请求,后期的应答

--请求方式get, post, put

#include <QNetworkRequest> --请求对象---请数据要放在这个对象中
#include <QNetworkReply> --当服务器回应的数据通过应答对象获取

 

 

 

 

通信流程

(1)创建QNetworkAccessManager对象

QNetworkAccessManager manager;

(2) 调用对象方法get/post发送请求(附带一个请求对象)

    QUrl url("http://t.weather.sojson.com/api/weather/city/城市id");

    //创建一个请求对象

    QNetworkRequest request(url);

    //发送请求

    manager.get(request);

(3)当本次请求完毕QNetworkAccessManager对象会发送finished信号

connect(&manager, &QNetworkAccessManager::finished,this, &HttpDownLoad::read_data);

 

4.在槽函数中获取应答对象并且通过应答对象读取服务器返回的数据

void HttpDownLoad::read_data(QNetworkReply *reply)

{

    QByteArray array = reply->readAll();//读取所有数据

}

Json格式数据解析

Json格式数据

对象{} ---对象中只能放键值对

数组[]----数组中只能放同类型数据[{},{},{}], [[],[],[]], [1,2,3,4,5], [a,b]

键值对 key:value  value可以是对象,数组, 数,字符串

    QByteArray array = reply->readAll();//读取所有数据

    //json解析
    QJsonParseError error;
    QJsonDocument doc = QJsonDocument::fromJson(array, &error);
    if(error.error != QJsonParseError::NoError)//校验格式是否有错
    {
        qDebug()<<"json error";
        return ;
    }

    QJsonObject obj = doc.object();
    QJsonObject weatherObj = obj.value("data").toObject();
    QJsonArray forecast = weatherObj.value("forecast").toArray();

UI设计

源码

头文件

#ifndef HTTPDOWNLOAD_H
#define HTTPDOWNLOAD_H

#include <QMainWindow>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

namespace Ui {
class HttpDownLoad;
}

class HttpDownLoad : public QMainWindow
{
    Q_OBJECT

public:
    explicit HttpDownLoad(QWidget *parent = nullptr);
    ~HttpDownLoad();

private slots:
    void on_getBt_clicked();

    void read_data(QNetworkReply *reply);
private:
    Ui::HttpDownLoad *ui;
    QNetworkAccessManager manager;
};

#endif // HTTPDOWNLOAD_H

cpp文件

#include "httpdownload.h"
#include "ui_httpdownload.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonParseError>

HttpDownLoad::HttpDownLoad(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::HttpDownLoad)
{
    ui->setupUi(this);
    //关联请求完毕信号finished(QNetworkReply* )
    connect(&manager, &QNetworkAccessManager::finished,this, &HttpDownLoad::read_data);
}

HttpDownLoad::~HttpDownLoad()
{
    delete ui;
}

void HttpDownLoad::on_getBt_clicked()
{
    QString place = ui->placeBox->currentText();
    QString num;
    if(place=="襄阳")
    {
        num = "101200201";
    }
    if(place == "武汉")
    {
        num="101200101";
    }
    if(place=="北京")
    {
        num = "101010100";
    }
    if(place == "广州")
    {
        num="101280101";
    }
    ui->numEdit->setText(num);
    QUrl url("http://t.weather.sojson.com/api/weather/city/" + num);
    //创建一个请求对象
    QNetworkRequest request(url);
    //发送请求
    manager.get(request);
}

void HttpDownLoad::read_data(QNetworkReply *reply)
{
    QByteArray array = reply->readAll();//读取所有数据

    //json解析
    QJsonParseError error;
    QJsonDocument doc = QJsonDocument::fromJson(array, &error);
    if(error.error != QJsonParseError::NoError)//校验格式是否有错
    {
        qDebug()<<"json error";
        return ;
    }

    QJsonObject obj = doc.object();
    QJsonObject weatherObj = obj.value("data").toObject();
    QJsonArray forecast = weatherObj.value("forecast").toArray();



    QLabel *week[4];
    week[0] = ui->label_week1;
    week[1] = ui->label_week1_2;
    week[2] = ui->label_week1_3;
    week[3] = ui->label_week1_4;
    QLabel *date[4];
    date[0] = ui->label_date1;
    date[1] = ui->label_date2;
    date[2] = ui->label_date3;
    date[3] = ui->label_date4;
    QLabel *hw[5];
    hw[0] = ui->label_hw;
    hw[1] = ui->label_hw1;
    hw[2] = ui->label_hw2;
    hw[3] = ui->label_hw3;
    hw[4] = ui->label_hw4;
    QLabel *type[5];
    type[0] = ui->label_type;
    type[1] = ui->label_type1;
    type[2] = ui->label_type2;
    type[3] = ui->label_type3;
    type[4] = ui->label_type4;
    QLabel *fxfl[5];
    fxfl[0] = ui->label_fxfl;
    fxfl[1] = ui->label_fxfl1;
    fxfl[2] = ui->label_fxfl2;
    fxfl[3] = ui->label_fxfl3;
    fxfl[4] = ui->label_fxfl4;
    QLabel *aqi[5];
    aqi[0] = ui->label_aqi;
    aqi[1] = ui->label_aqi1;
    aqi[2] = ui->label_aqi2;
    aqi[3] = ui->label_aqi3;
    aqi[4] = ui->label_aqi4;
    QLabel *tyim[5];
    tyim[0] = ui->label_im;
    tyim[1] = ui->label_im1;
    tyim[2] = ui->label_im2;
    tyim[3] = ui->label_im3;
    tyim[4] = ui->label_im4;

    //当前
    QString temp = weatherObj.value("wendu").toString();
    ui->label_temp->setText(temp);
    QJsonObject o = forecast.at(0).toObject();
    ui->label_time->setText(o.value("ymd").toString() + "   " +o.value("week").toString());
    QString ty = o.value("type").toString();
    type[0]->setText(ty);
    if(ty.contains("雨",Qt::CaseSensitive)){this->setStyleSheet("QMainWindow{border-image: url(:/new/prefix1/images/UI3.png)};");  }
    else{this->setStyleSheet("QMainWindow{border-image: url(:/new/prefix1/images/UI.png)};");}

    //后4天
    for(int i=1; i<5; i++)
    {
        QJsonObject o = forecast.at(i).toObject();
        qDebug()<<"时间:"<<o.value("ymd").toString();
        qDebug()<<"最高温度:"<<o.value("high").toString();
        qDebug()<<"最低温度:"<<o.value("low").toString();
        qDebug()<<"week:"<<o.value("week").toString();
        qDebug()<<"空气质量"<<o.value("aqi").toInt();
        qDebug()<<"fx:"<<o.value("fx").toString();
        qDebug()<<"fl"<<o.value("fl").toString();
        qDebug()<<"type:"<<o.value("type").toString();
        qDebug()<<"-----------------------";
        week[i-1]->setText(o.value("week").toString());
        date[i-1]->setText(o.value("ymd").toString());
    }

    for(int i=0; i<5; i++)
    {
       QJsonObject o = forecast.at(i).toObject();
       hw[i]->setText(o.value("high").toString().mid(3,2) + "~" + o.value("low").toString().mid(3,2) + "℃");
       QString ty = o.value("type").toString();
       type[i]->setText(ty);
       if(ty.contains("雨",Qt::CaseSensitive)){tyim[i]->setStyleSheet("border-image: url(:/new/prefix1/images/3.png);");}
       else{tyim[i]->setStyleSheet("border-image: url(:/new/prefix1/images/6.png);");}

       fxfl[i]->setText(o.value("fx").toString() + o.value("fl").toString());

       int aqi1 = o.value("aqi").toInt();
       if(aqi1 <50)
       {
           aqi[i]->setText(QString::number(aqi1) + "优");
       }
       if(aqi1>=50 && aqi1< 100)
       {
           aqi[i]->setText(QString::number(aqi1) + "中");
       }
       if(aqi1>=100)
       {
           aqi[i]->setText(QString::number(aqi1) + "差");
       }
    }
}

完毕!

发布了64 篇原创文章 · 获赞 82 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40602000/article/details/97890366