- 博客(42)
- 资源 (4)
- 收藏
- 关注
原创 Modbus TCP同步通信方式实现异步级效率
本文探讨了在 Modbus TCP 通信中,如何通过同步方式实现接近异步性能的方案。文章首先打破常规认知,指出在 Modbus 场景下同步方式同样可以达到高效,关键在于合理利用 CPU 等待 IO 的空闲时间。通过详细分析 Modbus 请求的生命周期和各环节耗时分布,作者提出采用多线程同步方式替代单线程异步调度的策略,并推导出计算所需线程数的公式。文章还提供了 Qt 实现方案,包括线程安全的请求队列设计和工作线程池架构。最终结论表明,在适当配置下(约20个同步线程),同步方式在局域网环境下可达到与异步相当
2026-05-28 16:19:25
413
原创 Modbus TCP 协议深度解析与 Qt 实战指南
本文深入解析Modbus TCP协议原理与Qt实现方案。首先详细介绍了Modbus TCP协议的分层结构、报文格式(包括MBAP头部和PDU)、核心功能码(如0x01读线圈、0x03读寄存器等)以及异常处理机制。随后重点阐述了Qt中Modbus TCP通讯的实现方法,包括Qt SerialBus模块的配置、QModbusTcpClient类的使用、连接建立过程以及超时设置等关键技术点。文章还涉及粘包拆包处理、断线重连机制和超时重发策略等工业通讯中的常见问题解决方案,为开发者提供了一套完整的Modbus TC
2026-05-28 16:16:38
545
原创 Qt 串口通讯架构
本文提出了一种Qt串口通讯的"万金油"架构方案,重点解决实际项目中常见的线程安全、数据粘包等问题。核心内容包括: 线程处理原则:QSerialPort必须在拥有事件循环的线程中创建和使用,否则readyRead信号无法触发。 整体架构设计:采用事件驱动+环形缓冲区处理数据流,通过信号槽实现UI/业务层、串口管理器和QSerialPort之间的解耦。 协议解析器设计:提供两种典型协议解析器实现(定界符协议和长度前缀协议),支持插拔式替换。 线程安全实现:通过QMutex保护共享资源,确保跨线程操作的安全性。
2026-05-22 14:50:56
526
原创 重载、覆盖、隐藏:C++ 多态三叉戟,你真搞懂了吗?
本文深入解析了C++中的重载、覆盖和隐藏三大核心概念。重载(Overloading)是同一作用域下同名不同参的函数,由编译器静态绑定;覆盖(Overriding)是继承体系中虚函数的重新定义,实现运行时多态;隐藏(Hiding)则是派生类同名成员导致基类版本不可见的副作用。文章通过代码示例详细说明了每种机制的原理、规则和常见陷阱,特别强调了Qt开发中的典型错误场景,并提供了正确实践建议。最后通过综合测试题检验读者对这三种机制的理解程度。
2026-05-22 13:56:47
352
原创 Qt工控仪器程序框架设计详解(工控多仪器控制版本)
本文介绍了一个基于Qt的工控仪器程序框架设计,采用分层架构解决测试仪器类应用程序开发中的常见问题。框架分为UI层(界面展示)、业务层(参数配置、分析计算、保存解析)、核心层(命令队列、协议解析)和硬件层(通讯接口),各层职责明确,通过接口抽象降低耦合。设计遵循单一职责、依赖倒置等原则,采用桥接、策略、观察者等模式实现模块化,使代码结构清晰、易于测试和扩展。框架适用于测试仪器、工业检测等场景,帮助开发者构建可维护的多仪器控制系统。
2026-05-18 17:45:00
517
原创 Inno Setup 卸载对话框语言切换问题
摘要: Inno Setup 打包应用时,卸载界面意外显示中文而非英文。排查发现: 使用非官方汉化版编译器导致内置中文资源无法覆盖 更换官方编译器后,标题/正文正常但按钮仍为中文 根本原因是卸载确认弹窗调用 Windows API MessageBox,按钮语言由系统区域决定 解决方案: 推荐方案:通过 Pascal 脚本创建自定义对话框完全控制文本(包括按钮) 替代方案:卸载时传参 /LANG=en 或手动修改资源文件(局限性大) 核心教训: 必须使用官方编译器 彻底清理旧版残留 系统级 UI 行为需通过
2026-05-18 16:46:52
1501
原创 Qt工控仪器程序框架设计详解(工控)
本文介绍了一种工控仪器程序的分层框架设计,采用模块化架构解决传统开发中的耦合严重、难以测试、扩展困难等问题。框架分为四层:硬件层(通讯接口)、核心层(基础设施)、业务层(参数配置/分析计算/保存解析)和UI层(界面展示)。每个模块遵循单一职责原则,通过设计模式(如桥接模式、观察者模式、工厂模式等)实现松耦合。框架强调接口抽象和分层隔离,使代码结构清晰、易于测试和扩展,适用于测试仪器、工业检测等场景。
2026-05-15 15:36:55
607
原创 Qt多线程高级应用案例
本文深入探讨了Qt框架中的多线程高级应用技术,主要包括以下核心内容: QThread深度解析:重点介绍了Worker对象模式的最佳实践,包括线程优先级设置和跨线程通信机制,强调生命周期管理和资源控制的重要性。 QThreadPool任务并行:详细讲解了线程池配置优化策略,包括线程数设置原则(IO密集型和CPU密集型任务的不同处理),以及QRunnable任务的自动清理机制。 QtConcurrent并发计算:展示了函数式编程风格的并行计算API,包括MapReduce模式和过滤归约操作,同时指出其在Qt6中
2026-05-15 10:23:29
439
原创 Qt连接数据库进阶应用
本文深入探讨Qt数据库应用的高级实践,重点介绍了企业级连接池的实现方案。文章展示了一个完整的DatabasePool类实现,包含连接池初始化、连接获取与释放、连接测试等核心功能。该连接池支持最小/最大连接数配置、连接超时控制、空闲连接检测等企业级特性,采用多线程安全设计,通过QMutex和QWaitCondition确保线程安全。实现中还包含连接有效性验证、自动回收空闲连接等优化措施,为Qt数据库应用提供了高性能、可靠的连接管理解决方案。
2026-05-14 09:29:40
217
原创 Qt连接数据库的详解与技巧
本文详细介绍了Qt数据库连接与操作的核心技术,包括:1) Qt支持的多种数据库驱动类型及检查方法;2) 建立SQLite和MySQL连接的具体代码示例;3) 执行SQL查询、参数绑定、事务处理等基本操作;4) 三种数据模型(QSqlTableModel、QSqlQueryModel、QSqlRelationalTableModel)的使用;5) 连接池实现、异步查询、NULL值处理等实用技巧。文章提供了完整的代码片段,帮助开发者快速掌握Qt数据库编程的关键技术点。
2026-05-13 17:59:07
172
原创 Qt多线程的使用与注意事项
本文介绍了Qt多线程编程的核心用法与注意事项。主要内容包括:1)QThread的两种使用方式(继承和moveToThread)及线程池管理;2)线程间通信机制(信号槽、invokeMethod和事件队列);3)线程安全保护工具(QMutex、QReadWriteLock等);4)常见注意事项如GUI操作限制、死锁避免和生命周期管理。文章强调优先使用moveToThread方式、信号槽跨线程通信、RAII风格锁等最佳实践,帮助开发者编写高效稳定的多线程Qt应用。
2026-05-13 15:30:29
469
原创 Qt自定义圆环比例控件
资源连接:https://download.csdn.net/download/congwang3960/92042493。
2025-09-28 10:47:20
161
原创 非线性最小二乘拟合的库接口NLSfit.h使用
调试:如果拟合失败,可以启用 deriv_debug 模式检查导数计算是否正确。模型函数:确保模型函数正确实现,并且能够处理边界情况(如除零错误)。初始参数:初始参数值应尽量接近真实值,否则可能导致拟合失败。
2025-02-06 13:25:18
738
原创 Qt通过句柄获取其它进程控件实例
1.通过spy++获取想要获取控件的句柄id。通过spy++获取另一个软件的文本框的句柄。根据句柄获取文本框的内容。
2024-06-27 14:26:47
1034
3
原创 C++设计模式之单例模式
单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
2024-06-19 21:40:48
573
原创 Labview调用Qt动态库的方法(与网上现有教程不同的是能用qt类)
【代码】Labview调用Qt动态库的方法(与网上现有教程不同的是能用qt类)
2024-04-15 15:23:35
1559
原创 QLibrary笔记
使用QLibrary可以在程序运行时加载动态链接库。一个QLibrary的实例作用于一个单一的共享库上。QLibrary提供了一种平台无关的方式访问库中的函数。可以在构建QLibrary的实例时将要加载的库文件传入,也可以在创建实例后使用setFileName()显式的设置要加载的文件名。当加载库文件时,QLibrary会搜索所有平台特定的库位置,除非传入的文件名具有绝对路径。如果传入的文件名具有绝对路径,那么会首先尝试加载该目录。如果该文件找不到,QLibrary会使用不同的平台特定的文件前缀或后缀再次
2022-04-08 11:30:46
1357
原创 QMdiArea之QMdiSubWindow子窗口隐藏系统标题栏
关于QMdiSubWindow去掉系统边框最小化的问题问题简述解决方案具体代码示例问题简述QMdiSubWindow去掉系统边框然后使用自定义实现菜单栏,进行最小化操作,第一个窗口的位置坐标在mdiarea显示范围之外。所以造成消失的问题。应该是自定义菜单栏没有重写对应的系统事件和最小化窗口的size。解决方案将最小化之前,显示系统标题栏,然后最小化,然后在隐藏系统标题栏,setvisible(true)。就解决这个问题。之前比较困扰,懒得去理他,最近才想到这个解决方案。具体代码示例void M
2022-03-21 15:47:28
2685
原创 QtWebEngine模块发布程序之后,软件崩溃的问题。
使用QtWebEngine模块,加载网页功能。程序发布后,点击加载会在有的系统上崩溃的解决办法第一种原因是:机器的显卡和系统所带的显卡驱动不匹配,导致QtWebEngine在渲染时出现了崩溃。解决办法:升级显卡驱动(如果是集成显卡,可能需要升级主板驱动)。第二种-在软件运行目录下添加文件,目前还不知道这几个文件起到什么作用,随后再看目录是:.\Qt5.9\5.9.1\msvc2015_64\resources\icudtl.datqtwebengine_devtools_resour
2021-11-19 15:27:28
2969
原创 QWebEngineView之加载html打印PDF
QWebEngineView通过QWebEngineView加载html文件打印pdf相比自己手动绘制pdf简单的多,制作好对应的html文件,然后Qfile读取html文件模板,替换函数需要替换的value,存成html文件,然后QWebEngineView加载,就直接能够打印成对应格式的pdf了。//读取html文件 QFile outFile(QStringLiteral("C://Users//JWGB//Desktop//出厂检验报告.html")); if(!outFile.
2021-10-21 11:00:05
2925
2
原创 std::lower_bound()和std::upper_bound()
//★对于升序排列的容器://std::lower_bound(): 返回一个迭代器,指向键值>=val的第一个元素。//std::upper_bound(): 返回一个迭代器,指向键值>val的第一个元素。//★对于降序排列的容器://std::lower_bound(): 返回一个迭代器,指向键值<=val的第一个元素。//std::upper_bound():返回一个迭代器,指向键值<val的第一个元素。//***注意//★当 val<队列最小值时,lowe
2021-09-18 09:02:52
841
原创 QPainter之ASSERT: “!fillData->clip->clipRect.isEmpty()“ in file painting\qpaintengine_raster.cpp
出现这个问题的原因是drawText 的时候 如果要绘制的文本过长,按font计算出来超过rect的宽度 就会报这个错误。debug版本会崩溃,release版本不会。
2021-08-27 15:38:11
1083
原创 Inno Setup安装脚本 修改系统环境变量,有则跳过,没有则创建。
借鉴网上博客大佬,然后进行修改之后编译不报错的版本,添加了通过list循环遍历判断是否包含即将添加的环境变量,避免用pos如果某一变量包含当前需要变量就无法创建的问题//------------------添加系统环境变量,避免找不到cmd-----------------------------------procedure SetEnv(aEnvName, aEnvValue: string; aIsInstall, aIsInsForAllUser: Boolean);varsOrgValue
2021-08-12 16:03:40
1807
原创 C++单例模式以及C++单例类模板
C++单例模式以及C++单例类模板在单例类里,又分为了懒汉式和饿汉式,它们的区别在于创建实例的时间不同:懒汉式 : 指代码运行后,实例并不存在,只有当需要时,才去创建实例(适用于单线程)饿汉式 : 指代码一运行,实例已经存在,当时需要时,直接去调用即可(适用于多线程)用法将构造函数的访问属性设置为private,提供一个GetInstance()静态成员函数,只能供用户访问唯一一个实例.定义一个静态成员指针,用来供用户获取重载 (=)赋值操作符以及拷贝构造函数,并设为private, 避免对
2021-06-24 11:40:08
327
原创 Qt加载Qt动态库dll
Qt加载含有socket模块的dll时当加载含有network模块的动态库时,被加载的工程也需要在pro文件上加上QT+=network语句,要不然会报错,找不到QTcpSocket头文件
2021-06-18 14:01:59
338
原创 Qt之QMdiArea的平铺问题
QMdiArea之tile平铺问题大多数窗口都是自定义,有些界面会设置固定大小,避免拉伸带来不美观的效果。例如:设置界面最大大小和最小大小是一个size this->setMaximumSize(1000,700); this->setMinimumSize(1000,700);结果使用QMdiArea的平铺函数时就会出现问题ui->mdiArea->tileSubWindows();当主界面最大化时,多窗口进行平铺操作,就会将主窗口还原,将size变成
2021-06-17 18:50:59
1346
原创 解决QT无法调试问题-----the cdb process terminated情况之一
解决QT无法调试问题-----the cdb process terminatedthe cdb process terminatedQt版本:5.7.1,windows10由于程序使用了提权,所以qt应该使用管理员权限运行,否则不管怎么调试构建运行,都会提示the cdb process terminate的,粗心导致,经验分享一下,做个笔记避免遗忘,哈哈哈。...
2021-01-28 13:45:34
1237
原创 QTableWidget的clear()
QTableWidget之清除内容QTableWidget作为封装好的的表格控件,基本的使用方法QTableWidget基本都包含了,今天主要说下关于QTableWidget的清除函数。clear(),清除函数,清空QWidgetWidget的全部内容,包括表头内容,清空完之后表头内容会默认成为1,2,3,4之类。但是不会删除掉行和列,比如表格|1| 2 ||3|4|| 5 | 6 | clear之后| | ||–|--|| | |只是text清掉,如果重新从0行插入数
2020-07-30 17:26:20
5615
原创 QThread之terminate()
@[TOC]QThread之terminate()关于Qt线程终止基本的Qt线程两种方法,一是:继承QThread类,然后重写run()函数,二是:movetothread(),通过信号和槽连接,运行在线程中。线程终止关于线程终止基本简单的也是两点,如下优雅的结束线程 ,调用QThread的wait();quit();等待线程函数执行完毕。然后退出线程。利用标志位,使其线程退出,但是如果线程里代码复杂,需要标志位太多,这种优雅放视就不太合适。暴力结束线程,terminate();这种方
2020-07-29 14:04:27
9101
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅