目录
设计目标
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) + "差");
}
}
}
完毕!