Qt天气预报系统实现HTTP请求
- 1、添加网请求络模块
- 2、声明一个网络请求对象
- 3、实例化一个网络请求对象
- 4、连接网络请求获取的信号与槽
- 5、新建一个网络请求获取的槽函数
- 6、定义一个获取天气数据的函数
- 7、在构造中,请求天气数据
- 8、请求天气数据
- 9、网络请求获取
- 10 .h文件和.cpp文件
- 10.1 .h文件
- 10.2 .cpp文件
1、添加网请求络模块
点击.pro文件,把network加入进去 |
https://i-blog.csdnimg.cn/direct/95b48ac9c2414b809fa680fef841b3f7.png" alt="在这里插入图片描述" />
2、声明一个网络请求对象
重新构建一下项目 |
https://i-blog.csdnimg.cn/direct/4d4ae4d1754f4ff88ac148796d6ab263.png" alt="在这里插入图片描述" />
声明一个网络请求对象 |
private:Ui::MainWindow *ui;QMenu *quitMenu; //创建一个菜单指针QAction *quitAct; //定义一个动作QPoint moffset; //窗口移动时,鼠标与窗口左上角的偏移值QNetworkAccessManager *NetAccessManger; //声明一个网络请求对象
鼠标放到QNetworkAccessManager 上,ALT+Enter 选择添加头文件 |
https://i-blog.csdnimg.cn/direct/b1228d8c086b4c4882ec83904a8a27ed.png" alt="在这里插入图片描述" />
3、实例化一个网络请求对象
NetAccessManger = new QNetworkAccessManager(this); //实例化一个网络请求对象
4、连接网络请求获取的信号与槽
connect(NetAccessManger,&QNetworkAccessManager::finished,this,&MainWindow::readHttpReply); //连接网络请求获取的信号与槽
5、新建一个网络请求获取的槽函数
public slots:void readHttpReply(QNetworkReply *reply); //新建一个网络请求获取的槽函数
ALT+Enter选择添加定义 |
https://i-blog.csdnimg.cn/direct/370ac860901f4f93ba6a6e3c29fdcac8.png" alt="在这里插入图片描述" />
鼠标放到QNetworkReply 上, ALT+Enter 选择添加头文件 |
https://i-blog.csdnimg.cn/direct/25e6c83096b542a1a9003e434a16895a.png" alt="在这里插入图片描述" />
6、定义一个获取天气数据的函数
protected:void mousePressEvent(QMouseEvent *event) override; //重写鼠标点击事件函数void mouseMoveEvent(QMouseEvent *event) override; //重写鼠标移动事件函数void getWeatherInfo(QString citycode); //获取天气数据
ALT+Enter选择添加定义 |
https://i-blog.csdnimg.cn/direct/b7d5c6bbf79d47ed8b2fddd145f93278.png" alt="在这里插入图片描述" />
7、在构造中,请求天气数据
//101010100是北京的城市编码
getWeatherInfo("101010100");
8、请求天气数据
//获取天气数据
void MainWindow::getWeatherInfo(QString citycode)
{QUrl url("http://t.weather.itboy.net/api/weather/city/" + citycode); //天气数据接口和城市编码NetAccessManger->get(QNetworkRequest(url)); //发送GET请求,获取数据}
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 选择添加头文件 |
https://i-blog.csdnimg.cn/direct/0a19184fe6ac407896385a71fd7a8200.png" alt="在这里插入图片描述" />
运行,最后,请求到的数据长这样 |
https://i-blog.csdnimg.cn/direct/c8ba74a4cfa5479eabdfcc45825f7137.png" alt="在这里插入图片描述" />
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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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(); //关闭UI界面void onQuitActTriggered(); //菜单被点击后的处理public slots:void readHttpReply(QNetworkReply *reply); //新建一个网络请求获取的槽函数private:Ui::MainWindow *ui;QMenu *quitMenu; //创建一个菜单指针QAction *quitAct; //定义一个动作QPoint moffset; //窗口移动时,鼠标与窗口左上角的偏移值QNetworkAccessManager *NetAccessManger; //声明一个网络请求对象bool closePOPWindow(); //关闭窗口的弹窗
};
#endif // MAINWINDOW_H
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);
// this->setLayout(ui->gridLayoutGlobal); //让界面随着窗口变幻大小quitMenu = new QMenu(this); //创建一个QMenu对象quitAct = new QAction(QIcon(":/widget/quit.png"), tr("退出"), this); //定义一个退出动作quitMenu->addAction(quitAct); //添加动作// connect(quitMenu,&QMenu::triggered,this,[=]{
// this->close();
// }); //连接信号与槽connect(quitMenu,&QMenu::triggered,this,&MainWindow::onQuitActTriggered); //连接菜单被触发的信号与槽NetAccessManger = new QNetworkAccessManager(this); //实例化一个网络请求对象connect(NetAccessManger,&QNetworkAccessManager::finished,this,&MainWindow::readHttpReply); //连接网络请求获取的信号与槽//101010100是北京的城市编码getWeatherInfo("101010100");}MainWindow::~MainWindow()
{delete ui;
}//鼠标点击
void MainWindow::mousePressEvent(QMouseEvent *event)
{//如果右键被按下if(event->button() == Qt::RightButton){quitMenu->exec(QCursor::pos()); //在当前鼠标位置显示菜单}//当前鼠标位置 event->globalPos()//当前窗口位置 this->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.setWindowFlags(Qt::Drawer); //把标题栏去掉mes.setIcon(QMessageBox::Warning); //设置一个警告图片mes.setText("是否关闭窗口?"); //弹窗文本mes.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); //设置两个按钮mes.setWindowIcon(QIcon(":/widget/dog.png")); // 设置窗口图标mes.setButtonText(QMessageBox::Ok, tr("确定")); //ok改为确认mes.setButtonText(QMessageBox::Cancel, tr("取消")); //Cancel改为取消// 显示消息框并等待用户交互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)); //发送GET请求,获取数据}//网络请求获取
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请求完成!