一、操作流程
01.UI界面
添加一个组合框(选择城市)、一个按钮(点击获取)、一个文本框(显示天气信息)

02.添加头文件
#include <QtNetwork>//网络类
#include <QNetworkAccessManager>//网络管理类
//Json数据类
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
03.添加槽函数
private slots:
void slot_http(QNetworkReply* reply);//网络连接
void slot_pushButton_consult();//查询按钮
04.网络连接
http = new QNetworkAccessManager;
http->get(QNetworkRequest(QUrl(QString("http://query.asilu.com/weather/baidu/?city=%1").arg(ui->comboBox_city->currentText()))));//连接天气网站
connect(http,SIGNAL(finished(QNetworkReply*)),this,SLOT(slot_http(QNetworkReply *)));//调用槽函数
05.获取天气信息、根据格式解读Json数据

void MainWindow::slot_http(QNetworkReply *reply)//槽函数获取天气信息解读
{
QByteArray Data = reply->readAll();//QByteArray类接收网站信息
QJsonDocument JsonDocument = QJsonDocument::fromJson(Data);//转为QJsonDocument类
QJsonObject JsonObject = JsonDocument.object();//转为QJsonObject类
QString City = JsonObject["city"].toString();//获取城市
ui->label_city->setText(City);
ui->textEdit->setText("");//清空文本框
for(int i = 0;i < 7;++i)//获取七天信息
{
QString date = JsonObject["weather"].toArray()[i].toObject()["date"].toString();
QString weather = JsonObject["weather"].toArray()[i].toObject()["weather"].toString();
QString temp = JsonObject["weather"].toArray()[i].toObject()["temp"].toString();
QString wind = JsonObject["weather"].toArray()[i].toObject()["wind"].toString();
ui->textEdit->append(date+" "+weather+" "+temp+" "+wind);//把信息追加到文本框
}
}
06.设置按钮槽函数
void MainWindow::slot_pushButton_consult()
{
http->get(QNetworkRequest(QUrl(QString("http://query.asilu.com/weather/baidu/?city=%1").arg(ui->comboBox_city->currentText()))));
}
07.结果展示


二、完整代码
01.mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtNetwork>
#include <QNetworkAccessManager>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
using namespace std;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QNetworkAccessManager* http;
private slots:
void slot_http(QNetworkReply* reply);
void slot_pushButton_consult();
};
#endif // MAINWINDOW_H
02.mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
http = new QNetworkAccessManager;
http->get(QNetworkRequest(QUrl(QString("http://query.asilu.com/weather/baidu/?city=%1").arg(ui->comboBox_city->currentText()))));
connect(http,SIGNAL(finished(QNetworkReply*)),this,SLOT(slot_http(QNetworkReply *)));
connect(ui->pushButton_consult,SIGNAL(clicked(bool)),this,SLOT(slot_pushButton_consult()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::slot_http(QNetworkReply *reply)
{
QByteArray Data = reply->readAll();
QJsonDocument JsonDocument = QJsonDocument::fromJson(Data);
QJsonObject JsonObject = JsonDocument.object();
QString City = JsonObject["city"].toString();
ui->label_city->setText(City);
ui->textEdit->setText("");
for(int i = 0;i < 7;++i)
{
QString date = JsonObject["weather"].toArray()[i].toObject()["date"].toString();
QString weather = JsonObject["weather"].toArray()[i].toObject()["weather"].toString();
QString temp = JsonObject["weather"].toArray()[i].toObject()["temp"].toString();
QString wind = JsonObject["weather"].toArray()[i].toObject()["wind"].toString();
ui->textEdit->append(date+" "+weather+" "+temp+" "+wind);
}
}
void MainWindow::slot_pushButton_consult()
{
http->get(QNetworkRequest(QUrl(QString("http://query.asilu.com/weather/baidu/?city=%1").arg(ui->comboBox_city->currentText()))));
}
三、注意事项
01.在.pro文件中添加network模块
QT += network
02.天气网站
http://query.asilu.com/weather/baidu/?city=上海
以上为本次案例获取天气的网址,汉字替换城市名即可获取其他城市天气信息(如果查询失败会返回北京天气内容)
http://t.weather.sojson.com/api/weather/city/101030100
备用天气网站,以cityId获取城市天气信息,返回成功状态(status)为:200,失败为非200