引入网络模块:
cpp
QT += core gui network
mainwindow.h:
cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
#include <QNetworkAccessManager>
#include <QNetworkReply>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
// 请求天气数据成功后自动调用 onReply() 槽函数
void onReply(QNetworkReply* reply);
protected:
// 根据城市编码获取城市天气信息
void getWeatherInfo(QString cityCode);
private:
Ui::MainWindow *ui;
// 发送网络请求 和 处理网络响应
QNetworkAccessManager *m_networkAccessManager;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_networkAccessManager = new QNetworkAccessManager(this);
// 获取天气数据完成后自动触发系统信号 finished,调用自定义槽函数 onReply
connect(m_networkAccessManager,&QNetworkAccessManager::finished,this,&MainWindow::onReply);
// 根据城市编码获取城市天气信息
// 101010100为北京市天气编码
getWeatherInfo("101010100");
}
MainWindow::~MainWindow()
{
delete ui;
}
// 请求数据成功后自动调用 onReply() 槽函数
void MainWindow::onReply(QNetworkReply *reply)
{
// 状态码:响应成功为 200
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
// qDebug()<<"请求方式:"<<reply->operation();
// qDebug()<<"状态码:"<<statusCode;
// qDebug()<<"URL:"<<reply->url();
// qDebug()<<"响应头:"<<reply->rawHeaderList();
if(reply->error() != QNetworkReply::NoError || statusCode != 200)
{// 天气数据请求失败
QMessageBox::warning(this,"天气","天气数据请求失败",QMessageBox::Ok);
}
else
{// 天气数据请求成功
QByteArray byteArray = reply->readAll();
qDebug()<<" info::::::"<<byteArray.data();
}
// 必须释放内存,否则会造成内存泄露
reply->deleteLater();
}
// 根据城市编码获取城市天气信息
void MainWindow::getWeatherInfo(QString cityCode)
{
QUrl url("http://t.weather.itboy.net/api/weather/city/"+cityCode);
// 使用 get 请求方式
m_networkAccessManager->get(QNetworkRequest(url));
}