qt QNetworkAccessManager详解
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, jsonifyapp = 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), 200return 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_itemreturn 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_itemreturn 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"}), 200return jsonify({"message": "Item not found"}), 404if __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_OBJECTpublic: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();
}

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

需要商务合作(定制程序)的欢迎私信!!
相关文章:
qt QNetworkAccessManager详解
1、概述 QNetworkAccessManager是QtNetwork模块中的一个核心类,它允许应用程序发送网络请求并接收响应。该类是网络通信的基石,提供了一种方便的方式来处理常见的网络协议,如HTTP、HTTPS等。QNetworkAccessManager对象持有其发送的请求的通用…...
部署 Vue 前端项目到 Linux
看看怎么把一个 Vue 3 项目部署到 Linux 服务器上。准备好你的咖啡,让我们愉快地度过这段部署时光! 前期准备 确保你已经在本地构建了 Vue 3 项目,并生成了 dist 文件夹。 npm run build构建完成后,你将看到一个新鲜出炉的 dis…...
数据分析:探索数据背后的秘密与挑战
在当今这个数据驱动的时代,数据分析已成为各行各业不可或缺的一部分。从市场营销到金融风控,从医疗健康到智能制造,数据分析为企业决策提供了强有力的支持。然而,尽管其重要性日益凸显,数据分析的过程并非一帆风顺&…...
文本域设置高度 加上文字限制并show出来:
文本域设置高度 :rows"4" 加上文字限制并show出来: maxlength"30" show-word-limit 效果: <el-form-item label"产品备注" prop"remark"><el-input v-model"form.remark" type"textarea"…...
深入浅出:Gin框架-简介与API开发入门
深入浅出:Gin框架-简介与API开发入门 引言 Gin框架是基于Go语言的HTTP Web框架,凭借其简单易用、性能卓越和丰富的功能,成为构建高性能Web应用的理想选择。本文将深入浅出地介绍Gin框架的基础知识,并通过一个简单的案例…...
MySQL各种锁详解
什么是锁? 1.1 锁的解释 计算机协调多个进程或线程并发访问某一资源的机制。 1.2 锁的重要性 在数据库中,除传统计算资源(CPU、RAM、I/O等)的争抢,数据也是一种供多用户共享的资源。 如何保证数据并发访问的一致性&…...
海外的bug-hunters,不一样的403bypass
一种绕过403的新技术,跟大家分享一下。研究HTTP协议已经有一段时间了。发现HTTP协议的1.0版本可以绕过403。于是开始对lyncdiscover.microsoft.com域做FUZZ并且发现了几个403Forbidden的文件。 (访问fsip.svc为403) 在经过尝试后࿰…...
React 组件中 State 的定义、使用及正确更新方式
🌈个人主页:前端青山 🔥系列专栏:React篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容React 组件中 State 的定义、使用及正确更新方式 前言 在 React 应用开发中,state …...
Jenkins 的HTTP Request 插件为什么不能配置Basic认证了
本篇遇到的问题 还是因为Jenkins需要及其所在的OS需要升级,升级策略是在一台新服务器上安装和配置最新版本的Jenkins, 当前的最新版本是: 2.479.2 LTS。 如果需要这个版本的话可以在官方站点下载,也可以到如下地址下载࿱…...
8 Bellman Ford算法SPFA
图论 —— 最短路 —— Bellman-Ford 算法与 SPFA_通信网理论基础 分别使用bellman-ford算法和dijkstra算法的应用-CSDN博客 图解Bellman-Ford计算过程以及正确性证明 - 知乎 (zhihu.com) 语雀版本 1 概念 **适用场景:**单源点,可以有负边࿰…...
nginx不允许静态文件被post请求显示405 not allowed
在单独站点的配置文件中 添加error_page 405 200 $request_uri; 即可!...
【c++笔试强训】(第三十二篇)
目录 数组变换(贪⼼位运算) 题目解析 讲解算法原理 编写代码 装箱问题(动态规划-01背包) 题目解析 讲解算法原理 编写代码 数组变换(贪⼼位运算) 题目解析 1.题目链接:数组变换__牛客网…...
shell脚本实战案例
文章目录 实战第一坑功能说明脚本实现 实战第一坑 实战第一坑:在Windows系统写了一个脚本,比如上面,随后上传到服务,执行会报错 原因: 解决方案:在linux系统touch文件,并通过vim添加内容&…...
OpenCV-图像阈值
简单阈值法 此方法是直截了当的。如果像素值大于阈值,则会被赋为一个值(可能为白色),否则会赋为另一个值(可能为黑色)。使用的函数是 cv.threshold。第一个参数是源图像,它应该是灰度图像。第二…...
lvgl9 Line(lv_line) 控件使用指南
文章目录 前言主体1. **Line 控件概述**2. **使用场景**3. **控件的样式**4. **设置点**5. **自动大小**6. **y 坐标反转**7. **事件处理**8. **示例代码** 总结 前言 在图形界面设计中,直线绘制是非常常见且重要的功能之一,尤其是在需要进行图形表示、…...
区块链概念 Web 3.0 实操
1. Web 3.0 概述 1.1 定义与背景 Web 3.0,也称为第三代互联网,是一个新兴的概念,它代表着互联网的未来发展和演进方向。Web 3.0的核心理念是去中心化、用户主权和智能化。这一概念的提出,旨在解决Web 2.0时代中用户数据隐私泄露…...
【人工智能】大数据平台技术及应用
文章目录 前言一、大数据平台基本概念及发展趋势1、数据量爆发式增长,发数据蓬勃发展2、大数据到底是什么?3、大数据处理与传统数据处理的差异4、为什么要建立大数据平台?5、大数据平台开源架构-Hadoop6、华为云大数据平台架构 二、大数据技术…...
Scala的模式匹配(7)
package hfdobject Test35 {case class Person(name:String)case class Student(name:String,className:String)//match case 能根据 类名和属性的信息,匹配到对应的类//注意://1 匹配的时候,case class的属性个数要对上//2 数学名不需要一一…...
使用 MATLAB 绘制三维散点图:根据坐标和距离映射点的颜色和大小
在数据可视化中,三维散点图是一种非常直观的方式来展示数据的分布。MATLAB 提供了强大的 scatter3 函数,可以用来绘制三维散点图,而通过调整点的颜色和大小,可以进一步增强图形的表现力。 在本篇博客中,我们将逐步讲解…...
数仓技术hive与oracle对比(五)
附录说明 附录是对测试过程中涉及到的一些操作进行记录和解析。 oracle清除缓存 alter system flush shared_pool; 将使library cache和data dictionary cache以前保存的sql执行计划全部清空,但不会清空共享sql区或者共享pl/sql区里面缓存的最近被执行的条目。刷…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
