自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(139)
  • 收藏
  • 关注

原创 C/C++可变参数宏定义

基础:用...声明可变参数,用接收。拆包:加解决被打包的问题。计数:用 “占位挤位法”()计算参数个数。拼接:用##拼接宏名,实现自动选择。封装:对外统一接口,内部自动分发。这套技巧在写通用日志宏、调试宏时非常有用,赶紧在你的代码里试试吧!

2026-04-03 11:47:39 264

原创 STL 互斥锁(mutex、lock_guard、unique_lock)使用详解

本文仅讲解 STL 互斥锁的使用方法,不涉及锁的基础概念。

2026-03-25 16:57:01 67

原创 Windows系统编译 libdatachannel(适配 OpenSSL 1.1.x)实操笔记

OpenSSL 1.1.x 编译的核心依赖是 Perl5(需安装组件)和 nasm 汇编器,需先完成环境配置;OpenSSL 的Configure命令可通过参数灵活控制编译位数、调试 / 发布版本、静态 / 动态库类型;编译 libdatachannel 时需手动指定路径,并按需禁用不需要的功能选项。

2026-02-13 16:44:48 858 1

原创 Qt6居然也可以做HTML5网页前端了

然后回到qtcreator,在首选项设置里找到sdks页面,切换到webassembly标签,把sdk路径设置为你安装的路径即可。接着用下面的命令下载Emsdk,这是一个可以把c++代码编译成js的工具。我这是Windows系统的,其他系统可以去。工程创建好后就像正常写widgets程序那样写代码就行了,编译好后点运行,就可以在浏览器中运行网页了。首先在安装qt的时候勾选这个webassembly。然后安装python,这个不需要我多说了吧。然后就可以创建html5工程了。

2026-02-12 11:36:18 220

原创 Error: dependent ‘..\..\..\..\Qt\5.15.2\msvc2019\include\QtWidgets\QMainWindow‘ does not exist.

核心问题:修改 Build 目录为源码子目录后,MSVC 编译报错,本质是变量设置异常,导致 qmake 生成多余回溯路径;临时解决:在 .pro 文件添加;最优解决:将上述配置写入 Qt 的 msvc 对应 qmake.conf 全局文件,一劳永逸;禁止 qmake 计算路径时向上回溯,避免生成异常路径。

2026-02-11 12:08:05 762

原创 C++/Qt 智能指针全解析:核心分类、原理与实战避坑

所有框架的智能指针(STL/Qt/ 其他),本质仅分为独占式和共享式两类,弱引用指针是共享指针的补充(解决循环引用),Qt 还提供了专属的 QPointer 用于野指针防护。本文从核心原理、使用场景、避坑技巧到实战排查,全面解析各类智能指针的用法,内容兼顾 STL 和 Qt,代码可直接复制使用,严格遵循}单独换行、指针引用贴近变量的编码规范。

2026-02-05 20:40:09 862

原创 彻底理清并解决QtCreator应用程序输出位置中文乱码问题

本文深入分析了Qt中qDebug输出中文乱码的根本原因,指出问题并非源于常见的UTF-8与GBK编码冲突,而是Qt原生输出流程中的UTF-16隐性转换导致的编码错位。文章提出了直接有效的解决方案:通过重写Qt消息处理器,将内部UTF-16字符串转回UTF-8编码后直接输出,确保从输入到输出的编码一致性。该方案仅需修改main.cpp文件,无需改动业务代码,是根治中文乱码问题的有效方法。

2026-02-04 19:09:22 953

原创 Qt5.15.2安装MSVC2019编译器

不知道是我的安装包问题,还是现在qt安装包里都不提供msvc编译器了,最新写的代码要和Windows平台强相关,mingw编译不过,必须要用msvc才行。当然也可以选择直接用vs,但是考虑到在现场环境测试,安装vs不方便,最终还是要用creator+msvc才行。既然qt的安装包不给提供了,那就去微软下吧,首先打开。如果是有网络的环境,直接运行vs_BuildTools.exe选择组件安装就行了。但如果需要拿到一个没用网络的环境,可以下载离线安装包,以管理员的权限打开cmd,执行下面命令。

2026-02-02 16:08:29 497 1

原创 Windows+VS2026 编译 c-toxcore 完整教程(含踩坑指南)

核心关键点:依赖安装必须用 VS 命令行,子模块需手动拉取,工具链路径要填完整;按需关闭音视频功能(BUILD_TOXAV=OFF)可简化依赖;FULL_STATIC=ON 适合部署(单文件无依赖),自用场景按需开启;遇到警告 / 错误先看日志,多数问题是路径 / 架构不匹配或子模块缺失导致。按此流程操作,可顺利编译出 32/64 位、动态 / 静态版本的 c-toxcore 库,后续可直接集成到自己的项目中使用。

2026-01-28 12:28:44 699

原创 C++组合优于继承?如何用完美转发优雅地“继承“基类方法

本文探讨了组合优于继承原则在实际应用中的困境,并提出基于C++11的完美转发解决方案。传统组合方式面临两个问题:公开基类对象违反封装原则,或需为每个基类方法编写大量包装函数。文章通过定义Animal基类和Whale子类,展示如何利用可变参数模板、成员函数指针和std::forward实现通用转发器。该方案能自动适配基类的任意公有方法,保持参数原始类型(左值/右值),且无运行时开销。这种编译时多态技术既维护了封装性,又提供了接近继承的语法便利性,是现代C++实现组合模式的理想方案。

2026-01-27 15:27:52 452

原创 C++ 反射进阶:优雅实现子类自动注册(线程安全版)

在之前的《C++ 也要玩反射》一文中,我们探讨了 C++ 实现反射的核心思路:通过map存储 “字符串 - 子类创建函数” 的键值对,程序启动时手动绑定该映射关系,从而实现通过字符串动态创建指定子类。但这种方式存在明显痛点 ——每新增一个子类,都需要修改统一的注册代码,违背 “开闭原则”。本文将解决这一问题,基于 C++ 全局 / 静态变量的初始化特性实现子类自动注册,并优化出线程安全版本,最终封装为通用宏定义,让子类注册真正做到 “新增即可用,无需修改原有代码”。

2026-01-27 11:15:23 491

原创 Qt全屏显示,在顶部工具栏的最右边显示关闭按钮

遇到一个奇葩需求,要求界面隐藏标题栏和任务栏全屏显示,但是又想在界面的右上角显示一个关闭按钮,关键是如何把工具栏上的按钮放在最右边,关键是我这还是要两个工具栏,一个常驻,一个需要根据状态隐藏和显示,这个关闭按钮还要在两个任务栏上跳舞,就比较蛋疼了,最终效果如下图所示。实现代码如下,直接在mainwindow构造函数中调用一下就行。

2026-01-21 15:52:49 72

原创 Qt全屏显示时自定义标题栏

遇到一个奇葩需求,既要我隐藏任务栏和标题栏做全屏,又要我有个标题栏显示信息,那就只能自定义标题栏了。实现代码如下,省却了头文件定义,自己加一下就行。

2026-01-21 15:40:56 71

原创 一个倒计时关闭的提示对话框

【代码】一个倒计时关闭的提示对话框。

2026-01-21 10:44:39 320

原创 踩坑实录!QSerialPort waitForReadyRead 超时顽疾,一招根治

在 Qt 开发中使用QSerialPort类读取串口数据时,常规操作是配置串口参数、打开串口,再绑定QSerialPort::readyRead信号,在槽函数中异步处理接收的数据,这种方式稳定且不阻塞线程。但很多开发者在需要超时等待读取场景时(超时时间内收到数据返回true并读取,超时未收到返回false做错误处理),会直接使用QSerialPort提供的waitForReadyRead函数,却遇到了「无论是否收到数据,函数始终超时返回false」的问题,本文将详细拆解该问题的核心原因,并提供两种可直接落地

2026-01-17 19:53:50 594

原创 Qt 多线程终极解决方案(封装优雅、可直接运行、避坑指南)

本文总结 Qt 三种多线程实现方式,重点讲解 QThreadPool+QRunnable 与 QtConcurrent 的优雅封装方案,提供可直接复制运行的代码,同时纠正常见认知误区、补充核心细节,助力开发者快速落地高可用多线程业务。

2026-01-13 15:01:11 551

原创 公司日志接口太菜鸡?Qt 封装一层直接封神,分级 + 线程安全 + 不丢失

摘要:本文介绍了一个基于Qt框架封装的线程安全日志模块,主要解决公司原有日志接口功能简陋、线程不安全等问题。该模块采用单例模式设计,通过Qt信号槽机制实现无锁线程安全调用,提供TRACE/DEBUG/INFO/WARNING/ERROR五级日志分级功能,并自动补全日志上下文信息。核心特点包括:1)使用Qt::QueuedConnection实现跨线程安全调用;2)监听程序退出信号确保日志不丢失;3)提供极简宏定义调用接口。模块还支持日志目录自动创建、兼容跨平台路径处理,并预留了日志级别动态开关、文件分割等扩

2026-01-09 16:11:30 681

原创 QtConcurrent 极简实战:一行代码让业务函数并发执行,无需重写任何类——比 QThreadPool 更轻量的多线程方案,附容器并行处理 / 返回值管控全攻略

本文介绍了QtConcurrent作为比QThreadPool更简洁的多线程解决方案。主要内容包括:1)基础配置方法;2)三种线程启动方式(全局函数、成员函数、Lambda);3)容器批量处理的并行接口(map/filtered/mappedReduced);4)任务管控工具QFuture和QFutureWatcher的使用;5)设计理念解析及注意事项。QtConcurrent无需重写类,一行代码即可实现多线程,特别适合简单场景和容器并行处理,是Qt中异步编程的高效选择。

2026-01-07 12:27:31 822

原创 Qt 线程池 QThreadPool 详解:比手动封装 QThread 更优雅的多线程方案

本文介绍了Qt中QThreadPool线程池的高效使用方法。通过QRunnable封装任务逻辑并重写run()函数,开发者可以轻松实现多线程编程。QThreadPool采用懒加载和线程复用机制,自动管理线程生命周期,默认最大线程数为CPU核心数以优化性能。文章提供了完整示例代码,详细说明了核心API和注意事项,强调要谨慎使用waitForDone避免阻塞主线程,并注意setAutoDelete的内存管理。相比手动管理QThread,QThreadPool是Qt官方推荐的多线程最佳实践方案。

2026-01-07 11:02:39 1093

原创 QDockWidget布局覆盖区域调整

本文介绍了Qt中处理多个dock窗口重叠区域的布局策略,控制dock窗口在重叠区域的优先显示顺序。

2026-01-06 11:29:55 201

原创 分享一个正确且优雅的使用Qt多线程的方法(可以一行代码不改直接用)

本文介绍了一个可直接使用的Qt线程控制方案,包含ThreadController和ThreadWorker两个核心类。ThreadController负责线程管理,提供start()启动线程、destroyThread()销毁线程等方法;ThreadWorker是抽象基类,用户需继承并重写doWork()实现具体业务逻辑。使用时创建ThreadWorker子类实例并设置到ThreadController中,通过start()启动线程执行任务,任务完成后自动触发workFinished信号。该方案支持线程安全

2025-12-26 09:44:17 456

原创 正确且优雅的使用QThread

我们在写Qt多线程的时候,都会直接重写QThread类的run方法,其实这种方式是Qt的设计者所反对的,它违背了QThread类的设计初衷,今天让我们来试一下如何正确使用QThread

2025-12-25 16:02:32 12449 3

原创 Qt中关于QTableWidget成员函数selectedItems和itemAt(QPoint)无法获取无数据Item的处理方式

而直接在界面双击单元格进行编辑时,QTableWidget会自动调用setItem函数向QTableWidget添加item,没有数据的单元格自然也就没有item,而没有item,selectedItems和itemAt都不会有结果返回。QTableWidget控件,有item,但是item没有数据,界面表现上可以选中,但是selectedItems函数返回的结果中,没有无数据但被选中的item。itemAt函数也是,给定的坐标点,有item,但是item没有数据,返回结果是空指针。

2025-12-18 18:42:57 311

原创 Qt中关于QLineEdit控件的editingFinished信号执行两次的处理方式

而敲回车造成的失去焦点事件,中间的间隔非常短,基本不可能在这个间隔时间内改变lineedit的内容,所以虽然槽函数响应了两次,但真正有效的操作却只执行了一次。该信号只有敲回车的时候才会触发,失去焦点无法触发该信号,所以敲回车只会触发一次。但是这个信号也有问题,就是失去焦点时无法触发,不管是鼠标点击其他控件还是敲回车,都不会触发,想要执行编辑结束事件,就只能敲回车了,失去焦点无法触发。也就意味着,当敲击回车时,会触发一次信号,信号响应结束后,控件失去焦点事件又触发了,从而会再一次执行槽函数。

2025-12-18 18:15:34 520

原创 Qt中关于eventFilter函数无法过滤QTableWidget鼠标事件的处理方式

而QAbstractScrollArea类的控件,并不只是本身的一个Wieget,内部还包含一个viewport。viewport也是一个widget,那些表格等item实际上是显示在viewport上的。也就是说,鼠标时间并没有传递给table,而是传递给了viewport。在上述代码中,我们想要的效果是,在table上点击鼠标时,程序能过滤到该事件,执行我们的代码。但在实际测试中发现,其他事件都能过滤的到,比如显示事件,键盘事件等。但唯独鼠标事件无法过滤,包括按下和释放时间都无法过滤。

2025-12-18 17:53:48 295

原创 MQL4中查询数据目录信息

参数property_id的说明如下表。

2024-08-08 19:52:28 381

原创 MQL4中一条K线中只执行一次

MQL4中,在一条K线中只执行一次的代码示例

2024-07-25 07:31:55 484

原创 MQL4中关于箭头的使用

MQL4中会遇到一些箭头标记的需求,刚开始使用的是ObjectCreate函数来创建一个箭头对象,但是使用过程中遇到好多问题,比如导致图标中对象太多,容易被用户误操作,很多需要绘制箭头的地方无法绘制等问题。后来发现图形元素就可以直接做成箭头形式,直接解决了使用箭头对象时所遇到的所有问题,代码也更简洁,特书写此文用以记录使用方法。

2024-07-24 22:23:41 1202

原创 MQL4中OnCalculate函数相关说明

/ 该事件每次价格变动时调用一次int OnCalculate(const int rates_total, // 图表上一共有多少根K线const int prev_calculated, // 已经算过的K线的根数。首次加载时,所有K线都没算过,所以该值为0;// 当OnCalculate执行过一次后,prev_calculated == rates_total;

2024-07-24 21:56:26 780

原创 Qt不能在线程函数操作UI

Qt的官方文档虽然并没有明确说明,不能在子线程中操作UI,但是,因为Qt是事件循环机制,所有的UI事件都是在主线程中处理的,如果在子线程中直接操作UI,就会存在线程安全问题,严重时候会使程序挂掉。参数5:Q_ARG宏,用来向函数传递参数,宏的第1个参数是函数参数的类型,第2个参数是传递参数的变量名,如果函数有多个参数,可以继续往下使用Q_ARG宏来传递。参数4:Q_RETURN_ARG宏,用来接收函数的返回值,宏的第1个参数是返回值类型,第2个参数是接收返回值的变量名。参数2:调用的方法名。

2023-12-21 21:52:57 2067

原创 C++也要玩反射

不论是哪种工厂模式,都逃不开一个根据字符串来判断具体创建具体产品子类的逻辑,每添加添加一个产品子类,都要去修改这部分的逻辑,这很不优雅。那有没有一种可能,就是添加子类产品的时候,只需要添加子类实现即可,不需要去修改这个判断逻辑呢?当然有,这个方法就是反射

2023-12-02 19:48:24 682

原创 工厂模式-

适用于根据特定条件创建相应子类的情景,添加新功能时只要添加一个子类,再在工厂类中添加相应的条件分支即可,不需要修改客户端代码。

2023-11-27 20:22:10 597

原创 Linux系统无法发送组播消息

此方法只是临时生效,机器重启或者拔掉网线后都会失效,需要重新执行该命令才行,下面介绍用就方法,重启和拔网线后依然生效,打开下图中IP配置界面。点击图中右下角的“路由”按钮,在弹出来的界面中配置好组播IP和子网掩码保存即可,不需要重启,网卡服务会自动重新启动。临时方法,执行系统命令。

2023-11-19 09:11:06 883

原创 字符编码和Qt中文乱码相关问题这里都给理清楚了

本文可以帮你彻底理清Qt程序中的中文乱码问题,做到不但知其然并且还能知其所以然。做中文软件开发的朋友应该都遇到过中文乱码问题,遇到这种情况,很多人都是百度一下,学到一个方法,放到程序里一试,见到确实有效,然后就丢在那不管了。这样做关键的问题有两个:一是很容易出现,在这个情况下有效,但到了另一个情况就无效了,还要找其他的方法去处理;二是有些东西根本就不是处理字符编码问题的,但用了确实能解决乱码问题,就会造成乱用的现象

2022-04-20 22:04:13 2158 3

原创 小型内存池

我们都知道,不管是用new还是用malloc,每次系统分配内存的时候都要占用系统资源的。而且每次我们向操作系统分配内存的时候,得到的都是包含cookie的内存块,其实际大小要大于我们所申请的内存大小。对于频繁申请内存的情况,我们可以一次向系统申请一大块内存,然后自己管理,这样既能节省系统调用的时间,能节省多个cookie所占用的空间。

2021-12-08 22:15:41 331

原创 c++中关于new和delete的内容都在这里了

new expressionnew一个类型,会创建一个该类型的内存,然后调用构造函数,最后返回该内存的指针注意:该操作是原子性的。在vc6中的实现如下void *operator new(size_t size, const std::nothrow_t &) _THR.

2021-12-08 22:06:00 1353

原创 Windows平台coredump处理

只适用于vs编译器,mingw好像是不支持MiniDumpWriteDump函数,这个不太确定,可以自己测试一下#ifdef Q_OS_WIN#include "dbghelp.h"#pragma comment( lib, "Dbghelp.lib" )LONG WINAPI AppExceptionCallback(struct _EXCEPTION_POINTERS *ExceptionInfo){ if (!QDir("logs").exists()) { QDir().mk

2020-11-15 16:09:38 1138

原创 Jekyll + Github Pages + CSDN迁移脚本 = 自己的云笔记

折腾了几天,将sbdn上的文章转移到gayhub pages上,做个简要笔记,以后sbdn上不再更新,转移到gayhub pages,新地址戳这里,废话不多说,直接开始gayhub部分创建gayhub帐号,然后新建一个名为用户名.github.io的存储库,注意,存储库的名称一定要是这个形式的,否则后期访问处理路径问题是很麻烦的向存储出中添加一个index.html或者README.md...

2020-03-27 11:43:45 11441

原创 Qt的TCP通讯

基本使用使用Qt的进行TCP通讯,主要用到两个类,QTcpServer和QTcpSocket。前者主要用于服务端的监听,相当于原始socket中由socket函数创建的监听socket;后者主要用于读写数据,相当于原始socket中由accept函数返回的连接socket。服务端的大致使用流程如下:创建QTcpServer对象,调用listen函数进行IP和端口号的监听,执行过该函数后,客...

2020-03-23 11:58:30 11796 1

原创 正确解决VS编译Qt遇到无法运行rc.exe问题

今天用vs新建一个qt工程,编译的时候发现无法运行“rc.exe”,习惯性的上网找解决办法,找到的都是把rc.exe复制来复制去的,这是绕开问题,不是解决问题。而且我之前的qt工程不用复制rc.exe也能正常编译,只有新建的不行,所以肯定有其他正确解决问题的方法,最简单的就是比较两个工程的配置,看有什么区别。打开工程属性,看下面的截图能正常编译的旧工程中的目标平台版本是8.1,而新建的工程默...

2020-03-19 11:59:23 13232 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除