Qt + HTTP 线程交互类封装
介绍
QT的HTTP模块封装的交互类,线程运行。使用时添加自己的业务逻辑即可
代码
头文件
/*** @file httpcontroller.h* @brief 云台相机的协议交互类* @author xintong-zhou* @date 2024-03-13*/#ifndef HTTPCONTROLLER_H
#define HTTPCONTROLLER_H#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QUrlQuery>
#include <QHttpMultiPart>
#include <QHttpPart>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QCryptographicHash>
#include <QThread>class HttpWorker : public QObject
{Q_OBJECTpublic:HttpWorker();~HttpWorker();/*** @brief 某条信息的处理* @param object json对象*/void dealXXInfo(const QJsonObject &object);public slots:/*** @brief 执行请求* @param url 请求地址* @param arg 请求参数*/void slotPostHttpRequest(const QString &url, const QJsonObject &obj);/*** @brief 保存交互返回数据*/void slotReadyRead();void slotReplyFinished();/*** @brief 返回数据接收完毕分发处理* @param recvBuffer 接收到的json数据*/void slotRecvData(const QByteArray &recvBuffer);signals:/*** @brief 向上转发结果*/void sigResult();private:QNetworkAccessManager *m_pManager = nullptr;
};class HttpController : public QObject
{Q_OBJECT
public:explicit HttpController(QObject *parent = nullptr);~HttpController();/*** @brief 设置时间日期* @param datetime 时间日期*/void setDateTimeInfo(const QDateTime &datetime);public slots:/*** @brief 线程退出*/void slotExitThread();/*** @brief 向上转发结果*/void slotResult();signals:/*** @brief 执行请求* @param url 请求地址* @param arg 请求参数*/void sigPostHttpRequest(const QString &url, const QJsonObject &obj);private://工作类、线程HttpWorker *m_pWorker = nullptr;QThread m_thread;//请求url以及参数值QString m_serverIP;QString m_url;QString m_arg;
};#endif // HTTPCONTROLLER_H
实现文件
#include "httpcontroller.h"HttpWorker::HttpWorker()
{m_pManager = new QNetworkAccessManager(this);
}HttpWorker::~HttpWorker()
{if(m_pManager != nullptr){delete m_pManager;m_pManager = nullptr;}
}void HttpWorker::dealXXInfo(const QJsonObject &object)
{}void HttpWorker::slotPostHttpRequest(const QString &url, const QJsonObject &obj)
{QJsonDocument jsonDoc = QJsonDocument(obj);QByteArray argInfo = jsonDoc.toJson(QJsonDocument::Compact);qDebug() << "post HttpRequest" << url << argInfo;QNetworkRequest request;request.setUrl(QUrl(url));request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");request.setHeader(QNetworkRequest::ContentLengthHeader, argInfo.length());QNetworkReply *reply = m_pManager->post(request, argInfo);connect(reply, &QNetworkReply::readyRead, this, &HttpWorker::slotReadyRead);connect(reply, &QNetworkReply::finished, this, &HttpWorker::slotReplyFinished);}void HttpWorker::slotReadyRead()
{}void HttpWorker::slotReplyFinished()
{QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());if(reply == nullptr){qDebug() << "replyFinished Reply nullptr";return;}QByteArray byteArray = reply->readAll();if(byteArray.isEmpty()){qDebug() << "replyFinished ByteArray empty";return;}//处理最终数据slotRecvData(byteArray);//清理资源reply->deleteLater();
}void HttpWorker::slotRecvData(const QByteArray &recvBuffer)
{QJsonParseError jsonerror;QJsonDocument doc = QJsonDocument::fromJson(recvBuffer, &jsonerror);if (doc.isNull() || jsonerror.error != QJsonParseError::NoError){QString info(recvBuffer);if(!info.isEmpty()){qDebug() << "recvData parseJson error" << jsonerror.errorString() << info;}return;}//解析json数据QJsonObject object = doc.object();QString cmd = object.value("cmd").toString();QJsonObject paramObj = object.value("param").toObject();//进行业务分发if("timeSetWeb" == cmd){dealXXInfo(object);}else if("timeSetWeb" == cmd){}
}HttpController::HttpController(QObject *parent) : QObject(parent)
{//请求urlm_serverIP = "192.168.25.111";m_url = m_serverIP + "/api/XX";m_pWorker = new HttpWorker();m_pWorker->moveToThread(&m_thread);connect(&m_thread, &QThread::finished, this,&HttpController::slotExitThread);connect(this, &HttpController::sigPostHttpRequest, m_pWorker, &HttpWorker::slotPostHttpRequest);connect(m_pWorker, &HttpWorker::sigResult, this, &HttpController::slotResult);m_thread.start();
}HttpController::~HttpController()
{if(m_pWorker){delete m_pWorker;m_pWorker = nullptr;}slotExitThread();
}void HttpController::setDateTimeInfo(const QDateTime &datetime)
{//封装信息QJsonObject obj;obj.insert("cmd", "timeSetWeb");QJsonObject param;param.insert("token", 0);param.insert("dateformat", 0);param.insert("timeformat", 1);param.insert("manually", 0);param.insert("year", datetime.date().year());param.insert("month", datetime.date().month());param.insert("day", datetime.date().day());param.insert("hour", datetime.time().hour());param.insert("minute", datetime.time().minute());param.insert("second", datetime.time().second());obj.insert("param", param);emit sigPostHttpRequest(m_url, obj);
}void HttpController::slotExitThread()
{m_thread.quit();m_thread.wait();
}void HttpController::slotResult()
{}相关文章:
Qt + HTTP 线程交互类封装
介绍 QT的HTTP模块封装的交互类,线程运行。使用时添加自己的业务逻辑即可 代码 头文件 /*** file httpcontroller.h* brief 云台相机的协议交互类* author xintong-zhou* date 2024-03-13*/#ifndef HTTPCONTROLLER_H #define HTTPCONTROLLER_H#include <QNet…...
GitHub Copilot+ESP开发实战-串口
上篇文章讲了GitHub Copilot在应用中可能遇到的问题,接下来小启就简单介绍下GitHub Copilot在ESP32开发中C语言实现串口功能,感兴趣的可以看看。 一、向Copilot提问: 1. ESP32用C语言实现串口初始化; 2.配置uart为1,…...
C# 使用ffmpeg将图片保存为mp4视频
使用 FFmpeg 这个强大的多媒体处理工具,可以轻松地将一系列图片转换为一个 MP4 视频文件。以下是一个基本的命令行示例来完成这个任务: ffmpeg -framerate 25 -i image-%03d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4 命令参数说明…...
Java安全技术及代码审计技巧
概述 Java安全编码和代码审计是确保Java应用程序安全性的重要环节。本文旨在介绍Java中常见的Web漏洞、安全编码示例以及一些常见漏洞函数,并提供一个自动化查找危险函数的Python脚本。 1. XML外部实体 (XXE) 漏洞 介绍 XML文档结构包括XML声明、DTD文档类型定义&…...
C# 使用OpenCvSharp4将Bitmap合成为MP4视频的环境
环境安装步骤: 在VS中选中项目或者解决方案,鼠标右键,选择“管理Nuget包”,在浏览窗口中搜索OpenCVSharp4 1.搜索OpenCvSharp4,选择4.8.0版本,点击安装 2.搜索OpenCvSharp4.runtime.win,选择4.8.0版本,点…...
[游戏开发][Unity] 导出Xcode工程,完成调试与发布
Unity导出Xcode工程(模拟器版本与真机调试) [游戏开发][Unity] 打包Xcode工程模拟器真机调试_unity5 打包xcod-CSDN博客 Unity导出发布版本Xcode工程,上传app到官网,正式发布或创建TestFlight Xcode发布AppStore与TestFlight全流程_xcode 上传到testfit-…...
JSONP 实现跨域请求案例
后端使用 express 搭建,案例代码如下: const express require(express)const app express() const PORT 3000app.get(/data, (req, res) > {const jsonData {name: Alan,age: 666,city: GD}const callback req.query.callback // 获取前端中的回…...
2024年智慧城市、人文发展与区域经济国际会议(ICSCCDRE 2024)
2024年智慧城市、人文发展与区域经济国际会议(ICSCCDRE 2024) 2024 International Conference on Smart Cities, Cultural Development and Regional Economy 会议简介: 城市经济人文发展是一个综合性的过程,它关注城市在经济、…...
目标检测——PP-YOLO算法解读
PP-YOLO系列,均是基于百度自研PaddlePaddle深度学习框架发布的算法,2020年基于YOLOv3改进发布PP-YOLO,2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet,2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列,所以放一起解…...
多特征变量序列预测(11) 基于Pytorch的TCN-GRU预测模型
往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测(一)数据集介绍和预处理-CSDN博客 风速预测(二)基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测ÿ…...
Lvs+keepalived+nginx搭建高可用负载均衡集群
环境配置 master主机192.168.199.149,虚拟IP192.168.199.148 back备机192.168.199.150 真实服务器1 192.168.199.155 真实服务器2 192.168.199.156 关闭防火墙和selinux master配置(149) 添加虚拟IP ip addr add 192.168.199.148/24 …...
WPF —— 控件模版和数据模版
1:控件模版简介: 自定义控件模版:自己添加的样式、标签,控件模版也是属于资源的一种, 每一个控件模版都有一唯一的 key,在控件上通过template属性进行绑定 什么场景下使用自定义控件模版,当项目里面多个地方…...
如何动态修改spring中定时任务的调度策略(1)
在我们日常开发中经常会调度工具来处理一下需要定时执行的任务,比如定时导出报表数据给业务方发送邮件。你在工作中是如何这种定时调度? 如何实现调度任务 使用java技术栈的老铁来说,现成定时调度的解决方案应该有很多,总结来说…...
idea import的maven类报红
idea 报红/显示红色的原因 一般报红,显示红色,是因为 idea 在此路径下,找不到这个类。 找到是哪个 jar 包的类导致 idea 报红 点击报红的路径的上一层,进入jar 包。比如: import com.aaa.bbb.ccc.DddDto;这个 impo…...
React——class组件中setState修改state
class组件中通过state去存储当前组件的数据,那怎么对其进行修改呢?就是方法this.setState({ 要修改的部分数据 }) setState() 作用:1 、修改 state 内容;2 、更新 UI 特别注意:react的核心其实是虚拟dom(数…...
搭建基于 Snowflake 的 CI/CD 最佳实践!
Snowflake 提供了可扩展的计算和存储资源,和基于 SQL 的界面 Snowsight,方便用户进行数据操作和分析。然而,如果用户想将自己的 CI/CD 流程与 Snowflake 集成时,会发现一些不便之处(尤其相比其 SnowSight 优秀的查询能…...
数据结构(五)——树的基本概念
五、树 5.1 树的基本概念 5.1.1 树的定义 树是n(n>0)个结点的有限集合,结点数为0的树称为空树 非空树的特性 有且仅有一个根节点没有后继的结点称为“叶子结点”(或终端结点)有后继的结点称为“分支结点”(或非终端结点&a…...
2.28CACHE,虚拟存储器
主存储器,简称主存。CPU可以直接随机地对其进行访问,也可以和高速缓存器及辅助存储器交换数据。 2> 辅助存储器,简称辅存,不能与CPU直接相连,用来存放当前暂时不用的程序和数据 3> 高速缓冲存储器,位于主存和CPU之间,用来…...
深入理解栈和队列(一):栈
个人主页:17_Kevin-CSDN博客 专栏:《数据结构》 一、栈的概念 栈(Stack)是一种特殊的线性表,它遵循后进先出(Last-In-First-Out,LIFO)的原则。栈可以被看作是一个只能在一端进行操作…...
electron-builder 打包问题,下载慢解决方案
目录 问题说明设置下载源 ?解决方案思路下载Electron下载winCodeSign下载nsis下载nsis-resources 总结 问题说明 项目使用了Electron,在第一次打包时会遇见下载慢,导致打包进度几乎停滞不前,甚至可能直接报错 其实这是因为Electr…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
