在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& ...
QCheckBox的三态复选框以及反选在使用这个控件的时候,需求有可能是:点击复选框实线反选,并且选中项目的时候需要显示未选中、部分选中和全选。在这个需求当中,首先想到的是直接启用三态复选框,但是点击的时候就变成了可以点三次,这就和反选冲突了。
1.QCheckBox的三种状态:12345enum CheckState { Unchecked, PartiallyChecked, Checked};
2.如何启用三态复选框使用setTristate(true)即可开启,使用void QCheckBox::setCheckState(Qt::CheckState state)参数为Qt::PartiallyChecked也会启用三态
3.如何实现需求显示选中状态:选择项目的时候根据选中情况设置QCheckBox的状态(如在QListView中可以通过QItemSelectionModel::selectionChanged信号实时统计)
123456789101112if (selectedItems == 0){ ui->ch ...
Qt高性能列表控件之QListView的使用及优点1.高性能列表如何能实线高性能?高性能列表无非就解决两个痛点:
数据存放在哪里
数据如何展示
为何QListWidget就不能高性能呢?QListWidget 是一个方便的控件,它内部管理了一个项目列表,并提供了一些简单的接口来添加、删除和修改这些项目。但没有对数据存储和数据展示进行过多的优化,这种方式适合于简单的应用场景,其中列表的大小不会很大,因为每个项目都会被存储为一个 QListWidgetItem 对象。
在QListView体系里,QAbstractListModel解决的是“数据存哪”,解决的是第一个问题,而QAbstractItemDelegate解决的是数据“如何展示”,解决的是第二个问题。
2.QListView和QAbstractListModel解决数据存哪这里就不从QAbstractListModel派生写自定义的类了,直接使用Qt从QAbstractListModel派生的类QStandardItemModel
123456789101112131415161718192021222324252627282 ...














