Qt天气预报系统实现HTTP请求

Qt天气预报系统实现HTTP请求

1、添加网请求络模块

|-----------------------|
| 点击.pro文件,把network加入进去 |

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

|----------|
| 重新构建一下项目 |

|------------|
| 声明一个网络请求对象 |

cpp 复制代码
private:
    Ui::MainWindow *ui;
    QMenu *quitMenu;                            //创建一个菜单指针
    QAction *quitAct;                           //定义一个动作
    QPoint moffset;                             //窗口移动时,鼠标与窗口左上角的偏移值

    QNetworkAccessManager *NetAccessManger;        //声明一个网络请求对象

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

3、实例化一个网络请求对象

cpp 复制代码
NetAccessManger = new QNetworkAccessManager(this);          //实例化一个网络请求对象

4、连接网络请求获取的信号与槽

cpp 复制代码
connect(NetAccessManger,&QNetworkAccessManager::finished,this,&MainWindow::readHttpReply);  //连接网络请求获取的信号与槽

5、新建一个网络请求获取的槽函数

cpp 复制代码
public slots:
    void readHttpReply(QNetworkReply *reply);                       //新建一个网络请求获取的槽函数

|-----------------|
| ALT+Enter选择添加定义 |

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

6、定义一个获取天气数据的函数

cpp 复制代码
protected:
    void mousePressEvent(QMouseEvent *event) override;      //重写鼠标点击事件函数
    void mouseMoveEvent(QMouseEvent *event) override;       //重写鼠标移动事件函数
    
    void getWeatherInfo(QString citycode);                  //获取天气数据

|-----------------|
| ALT+Enter选择添加定义 |

7、在构造中,请求天气数据

cpp 复制代码
//101010100是北京的城市编码
getWeatherInfo("101010100");

8、请求天气数据

cpp 复制代码
//获取天气数据
void MainWindow::getWeatherInfo(QString citycode)
{
    QUrl url("http://t.weather.itboy.net/api/weather/city/" + citycode); //天气数据接口和城市编码
    NetAccessManger->get(QNetworkRequest(url));            //发送GET请求,获取数据
    
}

9、网络请求获取

cpp 复制代码
//网络请求获取
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文件

cpp 复制代码
#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();          //关闭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文件

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请求完成!

相关推荐
用户8055336980310 小时前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner11 小时前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Goodbye5 天前
大模型无状态架构:从 HTTP 协议到 Harness AI 工程的深度解析
http
Quz5 天前
QML Hello World 入门示例
qt
xcyxiner8 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner9 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner9 天前
DicomViewer (添加模型类)3
qt
xcyxiner10 天前
DicomViewer (目录调整) 2
qt
xcyxiner10 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
霜落长河11 天前
抛弃TCP改用UDP,HTTP3怎么了?
http