qt QNetworkAccessManager详解

news2025/1/10 17:00:53
1、概述

QNetworkAccessManager是QtNetwork模块中的一个核心类,它允许应用程序发送网络请求并接收响应。该类是网络通信的基石,提供了一种方便的方式来处理常见的网络协议,如HTTP、HTTPS等。QNetworkAccessManager对象持有其发送的请求的通用配置和设置,包括代理、缓存配置等,并且包含了与此类问题相关的信号,以及可用于监视网络操作进展的回复信号。

2、重要方法

QNetworkAccessManager类提供了多种方法来发送网络请求,其中最常用的包括:

  • get():发送一个GET请求到指定的URL。
  • post():发送一个POST请求到指定的URL,并附带请求数据。
  • put()upload()等:用于执行更复杂的网络操作,如文件上传等。

此外,QNetworkAccessManager还提供了一些其他方法,如设置代理、处理重定向、处理身份验证等,以满足不同的网络需求。

3、重要信号

QNetworkAccessManager类定义了多个信号,用于通知应用程序网络操作的进展和结果。其中一些重要的信号包括:

  • finished(QNetworkReply*):当网络请求完成时触发此信号。QNetworkReply对象包含了下载的数据以及元数据(如头部信息)。
  • readyRead():当QNetworkReply对象中有新的数据可读时触发此信号。这允许应用程序在数据到达时逐步读取,而不是等待整个响应完成。
  • error(QNetworkReply::NetworkError):当网络请求出现错误时触发此信号。QNetworkReply::NetworkError枚举类型指定了错误的类型。

此外,QNetworkReply对象还定义了其他信号,如sslErrors()、uploadProgress()、downloadProgress()等,用于提供关于SSL错误、上传进度和下载进度的信息。

4、常用枚举类型

QNetworkAccessManager和QNetworkReply类定义了一些枚举类型,用于表示网络操作的状态和结果。以下是一些常用的枚举类型:

  • QNetworkAccessManager::NetworkAccessibility:表示网络是否可以通过该网络访问管理器访问。它用于检测应用程序的网络访问状态。
  • QNetworkAccessManager::Operation:表示QNetworkReply对象正在处理的操作类型,如GET、POST等。
  • QNetworkReply::NetworkError:表示在处理网络请求过程中可能出现的错误类型。

这些枚举类型提供了丰富的信息,帮助应用程序更好地处理网络请求和响应。

//模拟服务端

from flask import Flask, request, jsonify

app = Flask(__name__)

# 模拟一个数据库,用字典存储数据
data_store = {}

# GET 请求: 获取数据
@app.route('/data/<int:item_id>', methods=['GET'])
def get_data(item_id):
    item = data_store.get(item_id)
    if item:
        return jsonify(item), 200
    return jsonify({"message": "Item not found"}), 404

# POST 请求: 创建数据
@app.route('/data', methods=['POST'])
def create_data():
    # 从请求体中获取 JSON 数据
    new_item = request.get_json()
    item_id = new_item.get('id')

    if not item_id:
        return jsonify({"message": "ID is required"}), 400

    # 如果 ID 已存在,返回错误
    if item_id in data_store:
        return jsonify({"message": "Item with this ID already exists"}), 400

    # 保存数据到“数据库”
    data_store[item_id] = new_item
    return jsonify(new_item), 201

# PUT 请求: 修改数据
@app.route('/data/<int:item_id>', methods=['PUT'])
def update_data(item_id):
    # 从请求体中获取 JSON 数据
    updated_item = request.get_json()

    if item_id not in data_store:
        return jsonify({"message": "Item not found"}), 404

    # 更新数据
    data_store[item_id] = updated_item
    return jsonify(updated_item), 200

# DELETE 请求: 删除数据
@app.route('/data/<int:item_id>', methods=['DELETE'])
def delete_data(item_id):
    if item_id in data_store:
        del data_store[item_id]
        return jsonify({"message": "Item deleted"}), 200
    return jsonify({"message": "Item not found"}), 404

if __name__ == '__main__':
    app.run(debug=True)

客户端:

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QTextEdit>
#include <QLineEdit>
#include <QLabel>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>

class HttpClient : public QWidget {
    Q_OBJECT

public:
    HttpClient(QWidget *parent = nullptr) : QWidget(parent) {
        initUI();
        manager = new QNetworkAccessManager(this);
    }

private slots:
    void getData() {
        QString itemId = idInput->text();
        QNetworkRequest request(QUrl("http://127.0.0.1:5000/data/" + itemId));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
        QNetworkReply *reply = manager->get(request);
        connect(reply, &QNetworkReply::finished, this, [=]() {
            responseLabel->setText("Response: " + reply->readAll());
            reply->deleteLater();
        });
    }

    void createData() {
        QString itemData = dataInput->toPlainText();
        QNetworkRequest request(QUrl("http://127.0.0.1:5000/data"));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
        QNetworkReply *reply = manager->post(request, itemData.toUtf8());
        connect(reply, &QNetworkReply::finished, this, [=]() {
            responseLabel->setText("Response: " + reply->readAll());
            reply->deleteLater();
        });
    }

    void updateData() {
        QString itemId = idInput->text();
        QString itemData = dataInput->toPlainText();
        QNetworkRequest request(QUrl("http://127.0.0.1:5000/data/" + itemId));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
        QNetworkReply *reply = manager->put(request, itemData.toUtf8());
        connect(reply, &QNetworkReply::finished, this, [=]() {
            responseLabel->setText("Response: " + reply->readAll());
            reply->deleteLater();
        });
    }

    void deleteData() {
        QString itemId = idInput->text();
        QNetworkRequest request(QUrl("http://127.0.0.1:5000/data/" + itemId));
        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
        QNetworkReply *reply = manager->deleteResource(request);
        connect(reply, &QNetworkReply::finished, this, [=]() {
            responseLabel->setText("Response: " + reply->readAll());
            reply->deleteLater();
        });
    }

private:
    void initUI() {
        setWindowTitle("HTTP Client");
        QVBoxLayout *layout = new QVBoxLayout(this);

        idInput = new QLineEdit(this);
        idInput->setPlaceholderText("Enter Item ID");
        layout->addWidget(idInput);

        dataInput = new QTextEdit(this);
        dataInput->setPlaceholderText("Enter JSON data (for POST/PUT)");
        layout->addWidget(dataInput);

        responseLabel = new QLabel("Response:", this);
        layout->addWidget(responseLabel);

        QPushButton *getButton = new QPushButton("GET", this);
        connect(getButton, &QPushButton::clicked, this, &HttpClient::getData);
        layout->addWidget(getButton);

        QPushButton *postButton = new QPushButton("POST", this);
        connect(postButton, &QPushButton::clicked, this, &HttpClient::createData);
        layout->addWidget(postButton);

        QPushButton *putButton = new QPushButton("PUT", this);
        connect(putButton, &QPushButton::clicked, this, &HttpClient::updateData);
        layout->addWidget(putButton);

        QPushButton *deleteButton = new QPushButton("DELETE", this);
        connect(deleteButton, &QPushButton::clicked, this, &HttpClient::deleteData);
        layout->addWidget(deleteButton);

        setLayout(layout);
    }

    QLineEdit *idInput;
    QTextEdit *dataInput;
    QLabel *responseLabel;
    QNetworkAccessManager *manager;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    HttpClient client;
    client.show();
    return app.exec();
}

觉得有帮助的话,打赏一下呗。。

           

需要商务合作(定制程序)的欢迎私信!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2255033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序 AI 智能名片 2+1 链动模式商城系统中的社群电商构建与价值挖掘

摘要&#xff1a;本文聚焦于微信小程序 AI 智能名片 21 链动模式商城系统&#xff0c;深入探讨社群电商在其中的构建方式与所蕴含的价值。通过剖析社群概念的内涵与发展历程&#xff0c;揭示其在当今电商领域备受瞩目的原因&#xff0c;并详细阐述如何在特定的商城系统架构下&a…

亚马逊云科技re:Invent:独一无二的云计算

美国当地时间12月2日晚&#xff0c;作为拥有超过6万名现场参会者和40万名线上参会者的全球云计算顶级盛宴&#xff0c;亚马逊云科技2024 re:Invent全球大会在拉斯维加斯盛大揭幕。 作为本届re:Invent全球大会的首场重头戏&#xff0c;亚马逊云科技高级副总裁Peter DeSantis的主…

计算机网络研究实训室建设方案

一、概述 本方案旨在规划并实施一个先进的计算机网络研究实训室&#xff0c;旨在为学生提供一个深入学习、实践和研究网络技术的平台。实训室将集教学、实验、研究于一体&#xff0c;覆盖网络基础、网络架构、网络安全、网络管理等多个领域&#xff0c;以培养具备扎实理论基础…

常量变量和一些运算符

3.4 变量 常量&#xff1a;&#xff01;final关键字 final修饰基本类型不可以第二次赋值final修饰的引用类型不可以第二次改变指向final修饰的类不可以被继承final修饰的方法不可以被重写final防止指令重排序&#xff0c;遏制流水线性能优化&#xff0c;保障多线程并发场景下…

docker学习笔记(五)--docker-compose

文章目录 常用命令docker-compose是什么yml配置指令详解versionservicesimagebuildcommandportsvolumesdepends_on docker-compose.yml文件编写 常用命令 命令说明docker-compose up启动所有docker-compose服务&#xff0c;通常加上-d选项&#xff0c;让其运行在后台docker-co…

pytorch多GPU训练教程

pytorch多GPU训练教程 文章目录 pytorch多GPU训练教程1. Torch 的两种并行化模型封装1.1 DataParallel1.2 DistributedDataParallel 2. 多GPU训练的三种架构组织方式2.2 数据不拆分&#xff0c;模型拆分&#xff08;Model Parallelism&#xff09;2.3 数据拆分&#xff0c;模型…

Nginx配置https(Ubuntu、Debian、Linux、麒麟)

Ubuntu操作系统&#xff0c;Debian系统底层是Ubuntu&#xff0c;差异不大 ubuntu 安装nginx 1.安装依赖 sudo apt-get update sudo apt-get install gcc sudo apt-get install libpcre3 libpcre3-dev sudo apt-get install zlib1g zlib1g-dev sudo apt-get install openssl lib…

【组件封装】uniapp vue3 封装一个完整的Tabs(标签页)组件教程,功能由简到杂实现讲解。

文章目录 前言一、简单版Tabs代码实现&#xff1a; 二、下划线带动画的TabsAPI回顾&#xff1a;代码实现&#xff1a; 三、内容区域滑动切换切换动画代码实现&#xff1a;&#xff08;2&#xff09;禁用手势滑动切换&#xff08;3&#xff09;内容区域换为插槽 四、标签栏可滚动…

五、docker的网络模式

五、docker的网络模式 5.1 Docker的四种网络模式 当你安装docker时&#xff0c;它会自动创建三个网络&#xff0c;可使用如下命令查看&#xff1a; [rootlocalhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 7390284b02d6 bridge bridge lo…

生产慎用之调试日志对空间矢量数据批量插入的性能影响-以MybatisPlus为例

目录 前言 一、一些缘由 1、性能分析 二、插入方式调整 1、批量插入的实现 2、MP的批量插入实现 3、日志的配置 三、默认处理方式 1、基础程序代码 2、执行情况 四、提升调试日志等级 1、在logback中进行设置 2、提升后的效果 五、总结 前言 在现代软件开发中&…

【人工智能】深度解剖利用人工智能MSA模型

目录 情感分析的应用一、概述二、研究背景三、主要贡献四、模型结构和代码五、数据集介绍六、性能展示七、复现过程 情感分析的应用 近年来社交媒体的空前发展以及配备高质量摄像头的智能手机的出现&#xff0c;我们见证了多模态数据的爆炸性增长&#xff0c;如电影、短视频等…

MongoDB性能监控工具

mongostat mongostat是MongoDB自带的监控工具&#xff0c;其可以提供数据库节点或者整个集群当前的状态视图。该功能的设计非常类似于Linux系统中的vmstat命令&#xff0c;可以呈现出实时的状态变化。不同的是&#xff0c;mongostat所监视的对象是数据库进程。mongostat常用于…

Scratch教学作品 | 中国诗词大会——闯关擂台,品味诗词之美! ✨

&#x1f393; Scratch教学作品 | 中国诗词大会——闯关擂台&#xff0c;品味诗词之美&#xff01; &#x1f4dc;✨ 今天给大家推荐一款结合文化与挑战的Scratch作品——《中国诗词大会》&#xff01;由zhouyq制作&#xff0c;这款游戏让你置身诗词的世界&#xff0c;通过闯关…

安全关系型数据库查询新选择:Rust 语言的 rust-query 库深度解析

在当今这个数据驱动的时代&#xff0c;数据库作为信息存储和检索的核心组件&#xff0c;其重要性不言而喻。然而&#xff0c;对于开发者而言&#xff0c;如何在保证数据安全的前提下&#xff0c;高效地进行数据库操作却是一项挑战。传统的 SQL 查询虽然强大&#xff0c;但存在诸…

微信小程序里的小游戏研发需要什么技术栈

研发小程序里的小游戏通常需要以下技术栈&#xff1a; 前端技术 HTML5 / CSS3&#xff1a;用于构建游戏的界面布局和样式。JavaScript&#xff1a;作为核心编程语言&#xff0c;实现游戏的逻辑和交互。小程序开发框架&#xff1a;如微信小程序的开发框架&#xff0c;了解其 API…

Install PyTorch (安装 PyTorch)

Install PyTorch {安装 PyTorch} 1. Install PyTorch1.1. Previous PyTorch Versions1.2. Latest PyTorch1.3. 查看 PyTorch 的版本 References 1. Install PyTorch https://pytorch.org/ Select your preferences and run the install command. Stable represents the most …

第二篇:k8s工作流程

我们来看通过deployment部署pod的常规流程&#xff1a; kubectl向apiserver发送部署请求&#xff08;例如使用 kubectl create -f deployment.yml&#xff09;apiserver将 Deployment 持久化到etcd&#xff1b;etcd与apiserver进行一次http通信。controller manager通过watch a…

智创 AI 新视界 -- 优化 AI 模型训练效率的策略与技巧(16 - 1)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

第五节、电机多段运动【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍用控制步进电机三个主要参数角度、速度、方向&#xff0c;实现简单的步进电机多段控制 一、目标功能 输入多个目标角度&#xff0c;设定好步进电机速度&#xff0c;实现步进电机多段转动 二、计算过程 2.1 速度计算 根据第三节内容&#xff0c;定时器…

C++(九)

前言&#xff1a; 本文主要讲述运算符的优先顺序。 一&#xff0c;运算符的优先级。 请看以下表达式&#xff1a; a32*5 运算结果为&#xff1a;13. 可以看到&#xff0c;在此代码中&#xff0c;先运行了2*5的结果&#xff0c;在此基础上在进行3操作&#xff0c;因此结果…