Modbus RTU 通信流程文档一、读取流程(上位机 → 读 → 下位机)1:读取on_Btn_Read_clicked()
123456789101112void MainWindow::on_Btn_Read_clicked(){ QList<int> plist = requestRowId(); // 获取勾选的行号列表 for (int i = 0; i < plist.size(); i++) { QVector<int> addrs, nums, value; QVector<QString> sta_id_no_name; int fun = 0x03; // 功能码 0x03: 读保持寄存器 paraOfRequestDataInit(plist[i], ..., addrs, nums, fun, value, sta_id_no_name); ...
返回值优化(RVO)和命名返回值优化(NRVO)是C++编译器的两种优化技术,它们可以减少或消除函数返回对象时的不必要的复制操作。这些优化对于提高C++程序的性能非常关键,特别是在涉及大型对象或复制操作成本较高时。
1.RVO (Return Value Optimization) RVO是指在函数中直接构造返回值到调用函数的返回位置的优化。也就是说,编译器会将函数的返回值直接在调用者的上下文中构造,**从而避免了复制或移动构造函数的调用**。RVO最常见的情况是当函数返回一个临时对象时。
2. 命名返回值优化(NRVO) NRVO则是RVO的一个特殊情况,它适用于当函数返回一个具名的局部对象时。编译器会尝试消除这个局部对象和接收对象之间的复制或移动操作。
代码示例123456789101112131415161718192021#include <iostream>#include <vector>class Traceable {public: Traceable() { std::cout <& ...
在Windows平台使用Visual Studio进行C++或Qt开发时,文本编码问题是一个常见但容易被忽视的技术细节。本文将深入探讨如何通过保持编码一致性来彻底解决乱码问题。
编码问题的核心:三位一体的一致性要完全避免乱码,需要保证三个环节的编码完全统一:
源代码文件编码 - 源文件(.cpp/.h)本身的存储编码格式
编译器解析编码 - MSVC编译器读取源文件时使用的编码假设
运行时环境编码 - 程序执行时控制台或GUI环境的默认编码
具体配置方案1. 统一源代码编码推荐将所有源文件保存为带BOM的UTF-8编码:
在VS中可通过”文件→高级保存选项”设置
或使用文本编辑器批量转换现有文件
2. 配置编译器编码选项在项目属性中明确指定编码参数:
添加编译选项 /utf-8 强制使用UTF-8编码(等价于/source-charset:utf-8 /execution-charset:utf-8 )**/source-charset:utf-8 (指定源代码文件的字符编码)/execution-charset:utf-8( ...
Qt 高级状态机你是否曾写过这样的代码?
12345678if (isPlaying) { pause();} else if (isPaused) { resume();} else if (isStopped) { play();}// ... 各种if else嵌套,自己都快绕晕了
当程序需要处理多种“模式”或“状态”时,传统的 if-else 就像一团乱麻,难以维护且容易出错。
有没有一种更清晰、更强大的方式来管理这些状态呢?答案就是:状态机(State Machine)。今天,我们就用做蛋糕的比喻,来轻松理解这个听起来很高大上的概念。
一、什么是状态机?一个做蛋糕的比喻想象一下你正在做一个蛋糕,整个过程会经历几个明确的状态:
准备材料状态:你面前放着面粉、鸡蛋、糖。
搅拌状态:你把所有材料混合在一起搅拌。
烘烤状态:你把面糊放进烤箱。
装饰状态:蛋糕出炉后,你给它抹上奶油、放上水果。
现在,重点来了:
你不能在“准备材料”状态时,就直接把面粉放进烤箱,这会导致失败(甚至灾难!)。
你必须先完 ...
C++ REST SDK (cpprestsdk) HTTPS 通信SSL/TLS 证书验证全过程解析文档版本: 1.2 | 最后更新日期: 2025-09-12 | 作者: oqs
概述C++ REST SDK (cpprestsdk) 使用 SSL/TLS 访问 HTTPS 站点的过程是一套复杂的交互协议,其核心目的是为了验证网站身份的真实性并加密通信数据,防止信息被窃听或篡改。整个过程建立在标准的 TLS 握手基础之上,cpprestsdk 作为客户端封装了其中的复杂性。
完整交互过程一次完整的 HTTPS 请求包含四个主要阶段:
TCP 连接建立
TLS 握手与安全通道建立 (核心)
HTTP 应用数据交换
连接终止
阶段一:TCP 连接建立
客户端初始化应用程序创建 web::http::client::http_client 对象,并提供目标 HTTPS URL(例如 https://api.example.com)。
解析与连接cpprestsdk 库从 URL 中解析出主机名(api.example.com),并默认使用端口 443。底层网 ...
C++ REST SDK (cpprestsdk)编译ASIO版本过程1. 下载源码使用git命令下载cpprest代码:
1git clone -b v2.10.12 https://github.com/microsoft/cpprestsdk.git
2. 修改下载的源码2.1 修复CMakeLists文件Bugcpprestsdk的2.10.12版本的CMakeLists是有bug的,asio异步所需要的threadpool.cpp文件只有不排除websocket库的情况下才会链接到项目。显然目前项目是不需要websocket的,所以得强制让threadpool链接到项目里去,否则报无法解析的外部符号。
需要根据GitHub上该开源库的pull request修改:
修改 Release/src/CmakeLists.txt 文件
修改 Release/src/pplx/threadpool.cpp 文件
参考链接:https://github.com/microsoft/cpprestsdk/pull/1466/files
2.2 修改警告设置Release下的CMak ...
使用libheif库读取heic文件的缩略图1.先使用vcpkg安装libheif库在开始之前,我们需要安装 libheif 库。通过 vcpkg 工具可以方便地安装所需的依赖,根据实际需求选择适合的位数以及动态库或静态库版本。
安装命令示例:
12vcpkg install libheif:x86-windows-staticvcpkg install libheif:x64-windows-static
完成安装后,确保正确配置 vcpkg 环境,能够被 CMake 或其他构建工具找到。
2.解码缩略图和解码原图的区别在处理 HEIC 格式文件时,缩略图解码和原图解码的使用场景有所不同。以下从资源占用和代码实现两方面进行比较。
1.解码原图
解码原图时,图像数据会被完全加载到内存中,适合用于查看高清图片或后续进行深度处理。但这也意味着需要更多的内存和 CPU 资源。
2.解码缩略图
如果仅用于预览或快速浏览,可以选择解码缩略图。这种方法占用资源更少,加载速度更快,非常适合需要快速显示大量图片的场景。
解码原图(查看图片使用)
12345678910111213141516 ...
在使用 Qt 与 OpenCV 联合开发时,常常需要在 QImage 和 cv::Mat 之间进行图像格式转换。两者的图像格式不同,因此理解 QImage::Format 与 cv::Mat 类型的对应关系 非常关键。以下是常见格式的对应关系表:
1. QImage::Format 与 cv::Mat 类型对照表:
QImage::Format
描述
对应的 cv::Mat 类型
通道顺序
QImage::Format_RGB888
24-bit RGB(每像素3字节)
CV_8UC3
RGB → OpenCV中是BGR
QImage::Format_BGR888
24-bit BGR(Qt 5.14+)
CV_8UC3
BGR
QImage::Format_ARGB32
32-bit ARGB(Alpha在高字节)
CV_8UC4
BGRA(OpenCV里是BGRA)
QImage::Format_ARGB32_Premultiplied
预乘Alpha的32位ARGB
CV_8UC4
BGRA(需额外处理Alpha)
QImage::Format_RGB3 ...
Qt使用libheif库显示苹果的heic图片1.先使用vcpkg安装libheif库自己根据需要选择位数以及动态库还是静态库
12vcpkg install libheif:x86-windows-staticvcpkg install libheif:x64-windows-static
2.直接上代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879#include <QApplication>#include <QLabel>#include <QImage>#include <QPixmap>#include <libheif/heif.h>#include <iostream>QImage heifToQImage(const std::string& ...














