- 博客(146)
- 收藏
- 关注
原创 用中间层终结 M×N 子类爆炸:从 M×N 到 M+N+1
<think>我们需要回答用户请求:“根据以下内容,生成≤150字的文章摘要”。需要给出摘要,字数不超过150字。内容是关于用中间层解决M×N子类爆炸。摘要需要简洁概括核心:问题、解法、成本、关键。字数限制。我们需要确保摘要不超过150中文字符?用户说“≤150字”,通常中文。需要生成文章摘要。我们计算一下。 摘要建议:针对多数据结构与多存储格式的组合导致M×N子类爆炸,引入中间层IR,让数据先转为统一中间表示,再转出各格式,成本由乘法变为M+N+1。关键在于设计通用递归键值树,既可用JSON等现成方案,也
2026-08-31 17:08:43
142
原创 扫码枪接入踩坑记:键盘模式 + Raw Input 是怎么搞定失焦扫码的
扫码枪接入方案总结 本文探讨了扫码枪的两种工作模式及其优缺点: 串口模式:需特殊配置,通用性差但功能强大,支持后台运行和数据完整性控制 键盘模式:即插即用但存在焦点依赖和数据不可控问题 针对键盘模式的缺陷,作者提出了两种解决方案: 全局键盘钩子:可拦截系统键盘事件但存在性能风险 Raw Input:更优方案,能够识别输入设备且不影响其他进程 最终推荐使用Raw Input方案,通过时间间隔判断人机输入差异,解决了数据管控问题。该方案既保证了设备通用性,又避免了焦点依赖问题,是最稳健的扫码枪接入方案。
2026-08-20 16:34:45
217
原创 记一次 Qt 链接错误 LNK2001 的坑爹排查之旅
这次的LNK2001根源是一处不起眼的#include拼写错误:编译器宽容放行,moc 严格罢工,两者脱节,最终在链接阶段爆炸。永远不要相信编译器对#include的“容错”,更不要相信 moc 的“静默失败”——手动验证才是王道。愿后来者少走弯路。🚀。
2026-08-08 14:19:52
171
原创 MSVC 警告 C4819:为什么 QStringLiteral 反而报错,而裸字符串没事
摘要: MSVC编译Qt项目时,QStringLiteral("中文")触发C4819警告,而裸字符串"中文"却正常。原因是QStringLiteral展开为u""字面量,要求源码必须按UTF-8解码,但MSVC默认将源字符集视为ANSI(代码页0),导致UTF-8字节被误判为非法。裸字符串因未解码直接拷贝字节,运行时由fromUtf8还原,故无警告。 解决方案: 根治:在.pro文件中添加QMAKE_CXXFLAGS += /utf-8,强制源/执行字符集均为UTF-8; 检查:确认Makefile中是否
2026-08-03 14:35:48
132
原创 Jenkins + GitLab 自动化编译与部署实战指南
本文基于多个真实 Qt 项目的 Jenkins 脚本沉淀而成。全文按"写什么脚本 → 怎么传参数 → 怎么建多分支 → 有哪几种触发方式"的顺序讲清楚,照抄即可落地。
2026-07-30 20:26:10
218
原创 Qt 托盘消息提示开发指南(QSystemTrayIcon 避坑\+高清屏适配)
支持传入自定义QIcon对象,可使用本地图片、资源图标,自由度更高,适合项目个性化UI定制场景。Q_OBJECTpublic:// 弹出托盘消息private:#endifQt 托盘消息提示核心依赖,两种重载分别适配内置图标和自定义图标场景;重中之重:实例初始化必须执行setIcon()show(),且仅执行一次,否则消息完全不显示;低版本Qt高分屏务必提前开启属性,解决图标模糊问题;该方案轻量高效,无需额外配置,适配所有Qt桌面Windows/macOS/Linux项目。
2026-06-02 19:46:51
187
原创 Qt 基于 QAbstractNativeEventFilter 实现 USB 设备热插拔监听(获取VID/PID/设备路径)
在Qt开发中,常规的Qt事件循环无法直接捕获操作系统底层的原生消息。如果需要实现USB设备热插拔监听、系统热键拦截、系统设备状态变更等底层系统事件,就需要借助Qt提供的原生事件监听类。本文将详细讲解该类的核心原理、跨平台参数规则、Windows USB热插拔消息机制、官方踩坑要点,并提供一套单例模式、可直接使商用的USB设备热插拔监听完整源码,支持获取USB设备VID、PID、设备路径等详细信息。是Qt专门提供的操作系统原生消息监听抽象类,用于捕获Qt事件循环之外的系统底层原生事件。
2026-06-02 16:49:47
285
原创 C/C++可变参数宏定义
基础:用...声明可变参数,用接收。拆包:加解决被打包的问题。计数:用 “占位挤位法”()计算参数个数。拼接:用##拼接宏名,实现自动选择。封装:对外统一接口,内部自动分发。这套技巧在写通用日志宏、调试宏时非常有用,赶紧在你的代码里试试吧!
2026-04-03 11:47:39
300
原创 Windows系统编译 libdatachannel(适配 OpenSSL 1.1.x)实操笔记
OpenSSL 1.1.x 编译的核心依赖是 Perl5(需安装组件)和 nasm 汇编器,需先完成环境配置;OpenSSL 的Configure命令可通过参数灵活控制编译位数、调试 / 发布版本、静态 / 动态库类型;编译 libdatachannel 时需手动指定路径,并按需禁用不需要的功能选项。
2026-02-13 16:44:48
921
1
原创 Qt6居然也可以做HTML5网页前端了
然后回到qtcreator,在首选项设置里找到sdks页面,切换到webassembly标签,把sdk路径设置为你安装的路径即可。接着用下面的命令下载Emsdk,这是一个可以把c++代码编译成js的工具。我这是Windows系统的,其他系统可以去。工程创建好后就像正常写widgets程序那样写代码就行了,编译好后点运行,就可以在浏览器中运行网页了。首先在安装qt的时候勾选这个webassembly。然后安装python,这个不需要我多说了吧。然后就可以创建html5工程了。
2026-02-12 11:36:18
251
原创 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
871
原创 C++/Qt 智能指针全解析:核心分类、原理与实战避坑
所有框架的智能指针(STL/Qt/ 其他),本质仅分为独占式和共享式两类,弱引用指针是共享指针的补充(解决循环引用),Qt 还提供了专属的 QPointer 用于野指针防护。本文从核心原理、使用场景、避坑技巧到实战排查,全面解析各类智能指针的用法,内容兼顾 STL 和 Qt,代码可直接复制使用,严格遵循}单独换行、指针引用贴近变量的编码规范。
2026-02-05 20:40:09
911
原创 彻底理清并解决QtCreator应用程序输出位置中文乱码问题
本文深入分析了Qt中qDebug输出中文乱码的根本原因,指出问题并非源于常见的UTF-8与GBK编码冲突,而是Qt原生输出流程中的UTF-16隐性转换导致的编码错位。文章提出了直接有效的解决方案:通过重写Qt消息处理器,将内部UTF-16字符串转回UTF-8编码后直接输出,确保从输入到输出的编码一致性。该方案仅需修改main.cpp文件,无需改动业务代码,是根治中文乱码问题的有效方法。
2026-02-04 19:09:22
1071
原创 Qt5.15.2安装MSVC2019编译器
不知道是我的安装包问题,还是现在qt安装包里都不提供msvc编译器了,最新写的代码要和Windows平台强相关,mingw编译不过,必须要用msvc才行。当然也可以选择直接用vs,但是考虑到在现场环境测试,安装vs不方便,最终还是要用creator+msvc才行。既然qt的安装包不给提供了,那就去微软下吧,首先打开。如果是有网络的环境,直接运行vs_BuildTools.exe选择组件安装就行了。但如果需要拿到一个没用网络的环境,可以下载离线安装包,以管理员的权限打开cmd,执行下面命令。
2026-02-02 16:08:29
584
1
原创 Windows+VS2026 编译 c-toxcore 完整教程(含踩坑指南)
核心关键点:依赖安装必须用 VS 命令行,子模块需手动拉取,工具链路径要填完整;按需关闭音视频功能(BUILD_TOXAV=OFF)可简化依赖;FULL_STATIC=ON 适合部署(单文件无依赖),自用场景按需开启;遇到警告 / 错误先看日志,多数问题是路径 / 架构不匹配或子模块缺失导致。按此流程操作,可顺利编译出 32/64 位、动态 / 静态版本的 c-toxcore 库,后续可直接集成到自己的项目中使用。
2026-01-28 12:28:44
785
原创 C++组合优于继承?如何用完美转发优雅地“继承“基类方法
本文探讨了组合优于继承原则在实际应用中的困境,并提出基于C++11的完美转发解决方案。传统组合方式面临两个问题:公开基类对象违反封装原则,或需为每个基类方法编写大量包装函数。文章通过定义Animal基类和Whale子类,展示如何利用可变参数模板、成员函数指针和std::forward实现通用转发器。该方案能自动适配基类的任意公有方法,保持参数原始类型(左值/右值),且无运行时开销。这种编译时多态技术既维护了封装性,又提供了接近继承的语法便利性,是现代C++实现组合模式的理想方案。
2026-01-27 15:27:52
475
原创 C++ 反射进阶:优雅实现子类自动注册(线程安全版)
在之前的《C++ 也要玩反射》一文中,我们探讨了 C++ 实现反射的核心思路:通过map存储 “字符串 - 子类创建函数” 的键值对,程序启动时手动绑定该映射关系,从而实现通过字符串动态创建指定子类。但这种方式存在明显痛点 ——每新增一个子类,都需要修改统一的注册代码,违背 “开闭原则”。本文将解决这一问题,基于 C++ 全局 / 静态变量的初始化特性实现子类自动注册,并优化出线程安全版本,最终封装为通用宏定义,让子类注册真正做到 “新增即可用,无需修改原有代码”。
2026-01-27 11:15:23
513
原创 Qt全屏显示,在顶部工具栏的最右边显示关闭按钮
遇到一个奇葩需求,要求界面隐藏标题栏和任务栏全屏显示,但是又想在界面的右上角显示一个关闭按钮,关键是如何把工具栏上的按钮放在最右边,关键是我这还是要两个工具栏,一个常驻,一个需要根据状态隐藏和显示,这个关闭按钮还要在两个任务栏上跳舞,就比较蛋疼了,最终效果如下图所示。实现代码如下,直接在mainwindow构造函数中调用一下就行。
2026-01-21 15:52:49
97
原创 Qt全屏显示时自定义标题栏
遇到一个奇葩需求,既要我隐藏任务栏和标题栏做全屏,又要我有个标题栏显示信息,那就只能自定义标题栏了。实现代码如下,省却了头文件定义,自己加一下就行。
2026-01-21 15:40:56
99
原创 踩坑实录!QSerialPort waitForReadyRead 超时顽疾,一招根治
在 Qt 开发中使用QSerialPort类读取串口数据时,常规操作是配置串口参数、打开串口,再绑定QSerialPort::readyRead信号,在槽函数中异步处理接收的数据,这种方式稳定且不阻塞线程。但很多开发者在需要超时等待读取场景时(超时时间内收到数据返回true并读取,超时未收到返回false做错误处理),会直接使用QSerialPort提供的waitForReadyRead函数,却遇到了「无论是否收到数据,函数始终超时返回false」的问题,本文将详细拆解该问题的核心原因,并提供两种可直接落地
2026-01-17 19:53:50
733
原创 Qt 多线程终极解决方案(封装优雅、可直接运行、避坑指南)
本文总结 Qt 三种多线程实现方式,重点讲解 QThreadPool+QRunnable 与 QtConcurrent 的优雅封装方案,提供可直接复制运行的代码,同时纠正常见认知误区、补充核心细节,助力开发者快速落地高可用多线程业务。
2026-01-13 15:01:11
583
原创 公司日志接口太菜鸡?Qt 封装一层直接封神,分级 + 线程安全 + 不丢失
摘要:本文介绍了一个基于Qt框架封装的线程安全日志模块,主要解决公司原有日志接口功能简陋、线程不安全等问题。该模块采用单例模式设计,通过Qt信号槽机制实现无锁线程安全调用,提供TRACE/DEBUG/INFO/WARNING/ERROR五级日志分级功能,并自动补全日志上下文信息。核心特点包括:1)使用Qt::QueuedConnection实现跨线程安全调用;2)监听程序退出信号确保日志不丢失;3)提供极简宏定义调用接口。模块还支持日志目录自动创建、兼容跨平台路径处理,并预留了日志级别动态开关、文件分割等扩
2026-01-09 16:11:30
701
原创 QtConcurrent 极简实战:一行代码让业务函数并发执行,无需重写任何类——比 QThreadPool 更轻量的多线程方案,附容器并行处理 / 返回值管控全攻略
本文介绍了QtConcurrent作为比QThreadPool更简洁的多线程解决方案。主要内容包括:1)基础配置方法;2)三种线程启动方式(全局函数、成员函数、Lambda);3)容器批量处理的并行接口(map/filtered/mappedReduced);4)任务管控工具QFuture和QFutureWatcher的使用;5)设计理念解析及注意事项。QtConcurrent无需重写类,一行代码即可实现多线程,特别适合简单场景和容器并行处理,是Qt中异步编程的高效选择。
2026-01-07 12:27:31
855
原创 Qt 线程池 QThreadPool 详解:比手动封装 QThread 更优雅的多线程方案
本文介绍了Qt中QThreadPool线程池的高效使用方法。通过QRunnable封装任务逻辑并重写run()函数,开发者可以轻松实现多线程编程。QThreadPool采用懒加载和线程复用机制,自动管理线程生命周期,默认最大线程数为CPU核心数以优化性能。文章提供了完整示例代码,详细说明了核心API和注意事项,强调要谨慎使用waitForDone避免阻塞主线程,并注意setAutoDelete的内存管理。相比手动管理QThread,QThreadPool是Qt官方推荐的多线程最佳实践方案。
2026-01-07 11:02:39
1140
原创 分享一个正确且优雅的使用Qt多线程的方法(可以一行代码不改直接用)
本文介绍了一个可直接使用的Qt线程控制方案,包含ThreadController和ThreadWorker两个核心类。ThreadController负责线程管理,提供start()启动线程、destroyThread()销毁线程等方法;ThreadWorker是抽象基类,用户需继承并重写doWork()实现具体业务逻辑。使用时创建ThreadWorker子类实例并设置到ThreadController中,通过start()启动线程执行任务,任务完成后自动触发workFinished信号。该方案支持线程安全
2025-12-26 09:44:17
469
原创 正确且优雅的使用QThread
我们在写Qt多线程的时候,都会直接重写QThread类的run方法,其实这种方式是Qt的设计者所反对的,它违背了QThread类的设计初衷,今天让我们来试一下如何正确使用QThread
2025-12-25 16:02:32
12480
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
320
原创 Qt中关于QLineEdit控件的editingFinished信号执行两次的处理方式
而敲回车造成的失去焦点事件,中间的间隔非常短,基本不可能在这个间隔时间内改变lineedit的内容,所以虽然槽函数响应了两次,但真正有效的操作却只执行了一次。该信号只有敲回车的时候才会触发,失去焦点无法触发该信号,所以敲回车只会触发一次。但是这个信号也有问题,就是失去焦点时无法触发,不管是鼠标点击其他控件还是敲回车,都不会触发,想要执行编辑结束事件,就只能敲回车了,失去焦点无法触发。也就意味着,当敲击回车时,会触发一次信号,信号响应结束后,控件失去焦点事件又触发了,从而会再一次执行槽函数。
2025-12-18 18:15:34
542
原创 Qt中关于eventFilter函数无法过滤QTableWidget鼠标事件的处理方式
而QAbstractScrollArea类的控件,并不只是本身的一个Wieget,内部还包含一个viewport。viewport也是一个widget,那些表格等item实际上是显示在viewport上的。也就是说,鼠标时间并没有传递给table,而是传递给了viewport。在上述代码中,我们想要的效果是,在table上点击鼠标时,程序能过滤到该事件,执行我们的代码。但在实际测试中发现,其他事件都能过滤的到,比如显示事件,键盘事件等。但唯独鼠标事件无法过滤,包括按下和释放时间都无法过滤。
2025-12-18 17:53:48
313
原创 MQL4中关于箭头的使用
MQL4中会遇到一些箭头标记的需求,刚开始使用的是ObjectCreate函数来创建一个箭头对象,但是使用过程中遇到好多问题,比如导致图标中对象太多,容易被用户误操作,很多需要绘制箭头的地方无法绘制等问题。后来发现图形元素就可以直接做成箭头形式,直接解决了使用箭头对象时所遇到的所有问题,代码也更简洁,特书写此文用以记录使用方法。
2024-07-24 22:23:41
1250
原创 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
839
原创 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
2094
原创 C++也要玩反射
不论是哪种工厂模式,都逃不开一个根据字符串来判断具体创建具体产品子类的逻辑,每添加添加一个产品子类,都要去修改这部分的逻辑,这很不优雅。那有没有一种可能,就是添加子类产品的时候,只需要添加子类实现即可,不需要去修改这个判断逻辑呢?当然有,这个方法就是反射
2023-12-02 19:48:24
692
原创 Linux系统无法发送组播消息
此方法只是临时生效,机器重启或者拔掉网线后都会失效,需要重新执行该命令才行,下面介绍用就方法,重启和拔网线后依然生效,打开下图中IP配置界面。点击图中右下角的“路由”按钮,在弹出来的界面中配置好组播IP和子网掩码保存即可,不需要重启,网卡服务会自动重新启动。临时方法,执行系统命令。
2023-11-19 09:11:06
899
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅