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, 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();
}

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

           

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聊点技术 | AI赋能:根因定位如何深入到SQL级别

作者信息 背 景 在当今数字化时代&#xff0c;企业对IT系统的依赖日益加深&#xff0c;系统故障的影响也愈发严重。因此&#xff0c;快速准确地定位故障根因成为了IT运维领域的重要课题。传统的故障排查方法往往只能触及表面&#xff0c;无法深入到最核心的SQL级别&#xff0c…

scss文件内引入其他scss文件报错

1、今天在编译一些老项目的时候&#xff0c;老是提示下面信息 2、而且有很多Sass import rules are deprecated and will be removed in Dart Sass 3.0.0.警告 3、用npm view sass versions看&#xff0c;其中sass的最新版本是1.82.0 4、经过测试"sass": "1.75…

楼房销售系统设计与实现

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;楼房销售系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xf…

EasyMedia播放rtsprtmp视频流(flvhls)

学习链接 MisterZhang/EasyMedia - gitee地址 EasyMedia转码rtsp视频流flv格式&#xff0c;hls格式&#xff0c;H5页面播放flv流视频 EasyMedia播放rtsp视频流&#xff08;vue2、vue3皆可用&#xff09; EasyMedia转码rtsp视频流flv格式&#xff0c;hls格式&#xff0c;H5页…

一文了解模式识别顶会ICPR 2024的研究热点与最新趋势

简介 对模式识别研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICPR 2024的研究热点与最新趋势&#xff0c;帮助读者了解和跟踪模式识别的前沿研究方向。本推文的作者是黄星宇&#xff0c;审校为邱雪和许东舟。 一、会议介绍 ICPR…

完美解决Qt Qml窗口全屏软键盘遮挡不显示

1、前提 说明&#xff1a;我使用的是第三方软键盘 QVirtualKeyboard QVirtualKeyboard: Qt5虚拟键盘支持中英文,仿qt官方的virtualkeyboard模块,但使用QWidget实现。 - Gitee.com 由于参考了几篇文章尝试但没有效果&#xff0c;链接如下&#xff1a; 文章一&#xff1a;可能…

Bootstrap-HTML(三)Bootstrap5列表组全解析

Bootstrap-HTML&#xff08;三&#xff09;Bootstrap5列表组全解析 前言&#xff08;一&#xff09;HTML 列表基础回顾1.无序列表2.有序列表3.定义列表 二、无样式的有序列表和无序列表内联列表 三、Bootstrap5 列表组1.基础的列表组2.设置禁用和活动项3.链接项的列表组4.移除列…

rockit 学习、开发笔记(六)(VENC)

前言 上节我们讲到了VDEC解码模块&#xff0c;那当然少不了VENC编码模块了&#xff0c;一般有编解码的需求都是为了压缩视频的大小&#xff0c;方便减少传输所占用的带宽。 概述 VENC 模块&#xff0c;即视频编码模块。本模块支持多路实时编码&#xff0c;且每路编码独立&am…

使用Dapper创建一个简单的查询

1.先在NuGet上下载Dapper包 2.创建对应的model 代码如下&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 数据显示 {public class User{public int UserId { get; set; }public…

wireshark网络安全流量分析基础

网络安全流量分析领域中&#xff0c;wireshark和csnas是取证、安全分析的好工具&#xff0c;包括很多研究安全规则、APT及木马流量特征的小伙伴&#xff0c;也会常用到两个工具。这两款流量嗅探、分析软件&#xff0c;今天先介绍wireshark作为安全分析工具的基本使用。 2|002.…

深度学习笔记25_LSTM实现糖尿病探索与预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.9 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a;TensorFlow 2.10.0 二、GPU设置…

使用docker创建cloudstack虚拟主机

文章目录 概要 环境准备&#xff1a; 1.使用rockyLinux&#xff1a;8镜像 2.配置yum源 3.添加vim cloudstack.repo为以下内容 4.前期我们已经搭好了cloudstack平台&#xff0c;这里需要映射几个目录到容器里面&#xff0c; 5.创建Dockerfile 6.构建镜像 7.使用命令创建…

云计算对定制软件开发的影响

在当代数字世界中&#xff0c;云计算是改变许多行业&#xff08;包括定制软件开发&#xff09;的最伟大的革命性趋势之一。由于这些公司努力寻求更好、更多不同的方式来履行职责&#xff0c;因此云计算与传统的内部部署基础设施相比具有许多不可否认的优势。这种范式转变对定制…

Ubuntu Linux用户与组的管理

Ubuntu Linux操作系统- 第一弹 由猪猪侠开启Linux操作系统的学习 文章目录 前言Linux操作系统的发展Linux版本 Linux用户账户及其类型超级用户系统用户普通用户 Ubuntu超级用户权限与管理员Linux的超级用户权限解决方案Ubuntu管理员sudo命令su命令Ubuntu启用root登录 组账户及其…

案例研究|HYPER PaaS低代码工具携手DataEase嵌入式版,服务工业制造企业数智化转型

杭州星瀚智磐科技有限公司&#xff08;以下简称为“星瀚智磐”&#xff09;成立于2021年&#xff0c;是一家专注于低代码平台研发的高科技企业。星瀚智磐的核心产品HYPER PaaS低代码工具主要为制造业用户提供数字化解决方案。HYPER PaaS基于低代码平台简单的拖拉拽操作&#xf…

Linux-实用操作

文章目录 一. 各类实用小技巧(快捷键)1. ctrl c 强制停止2. ctrl d 退出登出3. history 查看历史命令4. !命令前缀&#xff0c;自动匹配上一个命令5. ctrl r&#xff0c;搜索历史命令6. ctrl a | e&#xff0c;光标移动到命令开始或结束7. ctrl ← | →&#xff0c;左右跳…

部署项目报错

vue2项目部署后 Error: Cannot find module /views/*** 1.起因 登录页、首页等静态页面可以正常进入&#xff0c;后端访问也正常&#xff0c;可以获取到验证码。 但是登录之后会发现首页空白或者进入不到首页 F12查看有报错信息&#xff1a;Error: Cannot find module ‘/v…

微信小程序配置less并使用

1.在VScode中下载Less插件 2.在微信小程序中依次点击如下按钮 选择 从已解压的扩展文件夹安装… 3.选中刚在vscode中下载安装的插件文件 如果没有修改过插件的安装目录&#xff0c;一般是在c盘下C:\用户\用户名.vscode\extensions\mrcrowl.easy-less-2.0.2 我的路径是&#xf…

gpt-computer-assistant - 极简的 GPT-4o 客户端

更多AI开源软件&#xff1a; AI开源 - 小众AIhttps://www.aiinn.cn/sources gpt-computer-assistant是一个将 ChatGPT MacOS 应用程序提供给 Windows 和 Linux 的替代工作。因此&#xff0c;这是一个全新且稳定的项目。此时&#xff0c;您可以轻松地将其作为 Python 库安装&am…

使用PPT科研绘图导出PDF边缘留白问题解决方案

使用PPT画图导出PDF格式后&#xff0c;边缘有空白&#xff0c;插入latex不美观&#xff0c;解决方案为自定义PPT幻灯片母版大小&#xff0c;如题步骤为&#xff1a; 1、查看已制作好的图片的大小&#xff0c;即长度和宽度 2、选择自定义幻灯片大小 3、自定义幻灯片大小为第1…