- 博客(139)
- 收藏
- 关注
原创 C/C++可变参数宏定义
基础:用...声明可变参数,用接收。拆包:加解决被打包的问题。计数:用 “占位挤位法”()计算参数个数。拼接:用##拼接宏名,实现自动选择。封装:对外统一接口,内部自动分发。这套技巧在写通用日志宏、调试宏时非常有用,赶紧在你的代码里试试吧!
2026-04-03 11:47:39
264
原创 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
原创 踩坑实录!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
原创 分享一个正确且优雅的使用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中关于箭头的使用
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
原创 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关注的人
RSS订阅