QT中的HTTP

发布于:2025-09-02 ⋅ 阅读:(22) ⋅ 点赞:(0)

QT中的HTTP

HTTP Client

进⾏ Qt 开发时, 和服务器之间的通信很多时候也会⽤到 HTTP 协议.

通过 HTTP 从服务器获取数据.

通过 HTTP 向服务器提交数据.

核⼼ API

关键类主要是三个. QNetworkAccessManager , QNetworkRequest , QNetworkReply

QNetworkAccessManager 提供了 HTTP 的核⼼操作.
在这里插入图片描述

QNetworkRequest 表⽰⼀个 HTTP 请求(不含 body).

如果需要发送⼀个带有 body 的请求(⽐如 post), 会在 QNetworkAccessManager 的 post ⽅法中通过单独的参数来传⼊ body.

在这里插入图片描述

其中的 QNetworkRequest::KnownHeaders 是⼀个枚举类型, 常⽤取值:
在这里插入图片描述

QNetworkReply 表⽰⼀个 HTTP 响应. 这个类同时也是 QIODevice 的⼦类

在这里插入图片描述

此外, QNetworkReply 还有⼀个重要的信号 finished 会在客⼾端收到完整的响应数据之后触发

代码⽰例

给服务器发送⼀个 GET 请求.

  1. 创建界⾯. 包含⼀个 QLineEdit , QPushButton

• 先使⽤⽔平布局把 QLineEdit 和 QPushButton 放好, 并设置这两个控件的垂直⽅向的sizePolicy 为 Expanding

• 再使⽤垂直布局把 QPlainTextEdit 和上⾯的⽔平布局放好. ( QPlainTextEdit 的readOnly 设为 true )

• 设置垂直布局的 layoutStretch 为 5, 1 (当然这个尺⼨⽐例根据个⼈喜好微调).

在这里插入图片描述

💡 此处建议使⽤ QPlainTextEdit ⽽不是 QTextEdit . 主要因为 QTextEdit 要进⾏富⽂本解析, 如果得到的 HTTP 响应体积很⼤, 就会导致界⾯渲染缓慢甚⾄被卡住

  1. 修改 widget.h, 创建 QNetworkAccessManager 属性
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QNetworkAccessManager>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    QNetworkAccessManager*manager;
};
#endif // WIDGET_H
  1. 修改 widget.cpp, 创建实例
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setWindowTitle("客户端");

    manager=new QNetworkAccessManager(this);
}
  1. 编写按钮的 slot 函数, 实现发送 HTTP 请求功能.
void Widget::on_pushButton_clicked()
{
    //1.获取到输入框中的url
    QUrl url(ui->lineEdit->text());
    //2.构造一个HTTP请求对象
    QNetworkRequest request(url);
    //3.发送请求
    QNetworkReply* response=manager->get(request);
    //4.通过信号槽来接受响应
    connect(response,&QNetworkReply::finished,this,[=](){
        if(response->error()==QNetworkReply::NoError)
        {
            QString html=response->readAll();
            ui->plainTextEdit->setPlainText(html);
        }
        else
        {
            ui->plainTextEdit->setPlainText(response->errorString());
        }
        //还需要对response进行释放
        response->deleteLater();
    });
}

网站公告

今日签到

点亮在社区的每一天
去签到