1、添加网请求络模块

2、声明一个网络请求对象

private:
Ui::MainWindow *ui;
QMenu *quitMenu;
QAction *quitAct;
QPoint moffset;
QNetworkAccessManager *NetAccessManger;
鼠标放到QNetworkAccessManager 上,ALT+Enter 选择添加头文件 |

3、实例化一个网络请求对象
NetAccessManger = new QNetworkAccessManager(this);
4、连接网络请求获取的信号与槽
connect(NetAccessManger,&QNetworkAccessManager::finished,this,&MainWindow::readHttpReply);
5、新建一个网络请求获取的槽函数
public slots:
void readHttpReply(QNetworkReply *reply);

鼠标放到QNetworkReply 上, ALT+Enter 选择添加头文件 |

6、定义一个获取天气数据的函数
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void getWeatherInfo(QString citycode);

7、在构造中,请求天气数据
getWeatherInfo("101010100");
8、请求天气数据
void MainWindow::getWeatherInfo(QString citycode)
{
QUrl url("http://t.weather.itboy.net/api/weather/city/" + citycode);
NetAccessManger->get(QNetworkRequest(url));
}
9、网络请求获取
void MainWindow::readHttpReply(QNetworkReply *reply)
{
int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if(reply->error() != QNetworkReply::NoError || status_code != 200)
{
qDebug() << reply->errorString().toLatin1().data();
QMessageBox::warning(this,"天气","请求数据失败", QMessageBox::Ok);
}
else
{
QByteArray byteArray = reply->readAll();
qDebug() << "read all:"<< byteArray.data();
}
reply->deleteLater();
}
鼠标放到QMessageBox 上, ALT+Enter 选择添加头文件 |


10 .h文件和.cpp文件
10.1 .h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMenu>
#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();
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void getWeatherInfo(QString citycode);
private slots:
void on_pushButton_quit_clicked();
void onQuitActTriggered();
public slots:
void readHttpReply(QNetworkReply *reply);
private:
Ui::MainWindow *ui;
QMenu *quitMenu;
QAction *quitAct;
QPoint moffset;
QNetworkAccessManager *NetAccessManger;
bool closePOPWindow();
};
#endif
10.2 .cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMouseEvent>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowFlag(Qt::FramelessWindowHint);
quitMenu = new QMenu(this);
quitAct = new QAction(QIcon(":/widget/quit.png"), tr("退出"), this);
quitMenu->addAction(quitAct);
connect(quitMenu,&QMenu::triggered,this,&MainWindow::onQuitActTriggered);
NetAccessManger = new QNetworkAccessManager(this);
connect(NetAccessManger,&QNetworkAccessManager::finished,this,&MainWindow::readHttpReply);
getWeatherInfo("101010100");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::RightButton)
{
quitMenu->exec(QCursor::pos());
}
if(event->button() == Qt::LeftButton)
{
moffset = event->globalPos() - this->pos();
}
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
this->move(event->globalPos() - moffset);
}
bool MainWindow::closePOPWindow()
{
QMessageBox mes;
mes.setWindowTitle("关闭窗口");
mes.setIcon(QMessageBox::Warning);
mes.setText("是否关闭窗口?");
mes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
mes.setWindowIcon(QIcon(":/widget/dog.png"));
mes.setButtonText(QMessageBox::Ok, tr("确定"));
mes.setButtonText(QMessageBox::Cancel, tr("取消"));
int result = mes.exec();
if (result == QMessageBox::Ok) {
this->close();
return true;
}
else
{
return false;
}
}
void MainWindow::on_pushButton_quit_clicked()
{
closePOPWindow();
}
void MainWindow::onQuitActTriggered()
{
closePOPWindow();
}
void MainWindow::getWeatherInfo(QString citycode)
{
QUrl url("http://t.weather.itboy.net/api/weather/city/" + citycode);
NetAccessManger->get(QNetworkRequest(url));
}
void MainWindow::readHttpReply(QNetworkReply *reply)
{
int status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if(reply->error() != QNetworkReply::NoError || status_code != 200)
{
qDebug() << reply->errorString().toLatin1().data();
QMessageBox::warning(this,"天气","请求数据失败", QMessageBox::Ok);
}
else
{
QByteArray byteArray = reply->readAll();
qDebug() << "read all:"<< byteArray.data();
}
reply->deleteLater();
}
实现HTTP请求完成!