获取天气预报信息,解读JSON数据包

该文详细介绍了如何利用Qt框架中的QNetworkAccessManager进行网络请求,从指定URL获取天气信息,然后通过QJsonDocument和QJsonObject解析JSON数据,展示城市天气,包括日期、天气状况、温度和风向。示例代码包括添加头文件、设置槽函数、网络连接和数据处理等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、操作流程

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值