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

相关推荐
小酒丸子2 小时前
基于QT和C++的实时日期和时间显示
c++·qt
Code侠客行2 小时前
MDX语言的正则表达式
开发语言·后端·golang
编程|诗人2 小时前
TypeScript语言的正则表达式
开发语言·后端·golang
XWM_Web2 小时前
JavaAPI.02.包装类与正则表达式
java·开发语言·学习·eclipse
BinaryBardC2 小时前
R语言的正则表达式
开发语言·后端·golang
CyberScriptor2 小时前
C#语言的字符串处理
开发语言·后端·golang
AI向前看3 小时前
Perl语言的文件操作
开发语言·后端·golang
李匠20243 小时前
Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)
开发语言·后端·scala
Quantum&Coder3 小时前
Dart语言的数据结构
开发语言·后端·golang