自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式Qt接收串口数据错乱问题分析:缓冲区残留数据的陷阱

嵌入式系统开发中,串口通信启动时数据异常问题的分析表明:由于硬件和驱动缓冲区在应用程序启动前已积累数据,导致程序最初读取的是旧数据而非实时数据。解决方案是在打开串口后立即清空缓冲区(使用tcflush或循环读取丢弃),确保从实时数据开始处理。这一案例揭示了嵌入式开发的重要原则:硬件状态具有持久性,软件必须显式管理初始状态,通过防御性编程和系统调试方法处理边界情况。建议所有串口初始化函数都应包含缓冲区清空逻辑,以建立更健壮的通信框架。

2026-01-07 19:18:26 819

原创 基于Qt的UDP广播发现与TCP连接系统的设计与实现

本文介绍了基于Qt框架实现UDP广播发现与TCP可靠连接的网络通信系统。系统采用混合架构:UDP广播用于快速服务发现,TCP连接确保数据传输可靠性。详细阐述了客户端和服务器的核心组件设计,包括UDP广播/响应机制、TCP连接管理、多线程数据接收与队列处理等关键技术实现。系统具备自动发现、可靠传输、断线重连等特性,适用于物联网设备控制、局域网文件传输等场景,并通过模块化设计保证扩展性。文章还提供了性能优化建议和完整的测试验证方案。

2026-01-06 10:53:06 854

原创 Qt绘制残留问题排查与修复日志

摘要:Qt应用程序中PMainWidget父对象绘制线条时出现像素残留问题。研究发现Qt默认使用局部重绘机制,仅更新变化区域,导致旧线条未被完全清除。子控件PWaveWin的绘制时机晚于父控件,其未更新区域会遮挡部分线条。解决方案包括:1)精确计算新旧线条更新区域;2)强制完整重绘;3)优化绘制逻辑。最终采用方案1,通过手动计算包含新旧线条的更新区域,同时更新子控件,既解决了残留问题又保持了最佳性能。该案例揭示了Qt绘制系统中性能与正确性的平衡机制,建议开发者需显式管理更新区域并注意控件层级关系。

2026-01-04 15:22:06 875

原创 Qt跨线程网络通信:QSocketNotifier警告及解决

摘要:Qt多线程网络应用中,直接跨线程操作QTcpSocket会触发"QSocketNotifier"警告,因QObject具有线程亲和性,其内部机制依赖创建线程的事件循环。本文分析了四种解决方案:1) 信号槽机制(推荐),通过主线程处理socket操作;2) 使用QMetaObject::invokeMethod异步调用;3) 为每个线程创建独立socket;4) 线程安全队列缓冲数据。调试时可通过断言、日志或事件过滤器检测跨线程调用。优化建议包括批量发送减少信号、共享内存传递大数据等

2025-12-26 15:10:56 775

原创 嵌入式多线程创建时序导致的段错误分析与解决

摘要:Qt项目中出现随机段错误,排查发现是多线程时序问题。当模块A未初始化时,其他模块已启动线程并向其发送数据。通过内存监控和日志分析定位问题,提出三种解决方案:调整创建顺序、添加NULL判断或实现信号量同步。该案例表明段错误不仅由内存问题引起,多线程时序不当同样会导致严重问题。关键启示是设计多线程系统时需考虑"消费者先于生产者"原则,或通过同步机制处理启动阶段的竞争条件。

2025-12-23 17:27:05 255

原创 C++ Lambda表达式

C++ Lambda表达式全面解析:从基础到Qt高级应用 本文深入探讨了C++11引入的Lambda表达式特性及其发展。主要内容包括: 基础语法 完整结构:capture->return_type{body} 捕获机制:值捕获、引用捕获、混合捕获 mutable关键字使用 现代C++增强 C++14泛型Lambda(auto参数) C++17 constexpr Lambda和*this捕获 C++20模板Lambda Qt高级应用 替代传统槽函数简化代码 动态控件处理 异步操作与UI更新 自定义信号

2025-11-20 09:33:28 878

原创 Qt项目中串口通信解析:原理、实现与最佳实践

本文对比分析了Qt和C语言两种串口通信实现方式。Qt采用高级框架QSerialPort,具有跨平台、事件驱动、开发高效等优势;而C语言底层开发则能提供极致性能、资源占用少和完全控制。针对实际项目需求,提出混合架构方案:Qt线程管理界面,C语言负责底层通信驱动,通过QMutex保证线程安全,结合两种方案优势。测试表明该方案既保持了开发效率,又保证了通信性能,适合对实时性要求较高的工业应用场景。

2025-11-08 14:24:00 797

原创 Qt数据可视化深度解析:从图表到表格的完整指南

本文详细介绍了Qt框架中的数据可视化实现方法,重点讲解饼图、线图和表格的创建技术。内容涵盖QtCharts模块配置、图表分层架构设计、交互式图表实现、实时数据更新和表格高级功能。文章对比了不同组件的设计模式差异,提供了性能优化建议,并通过创建数据分析仪表板的实战演示如何集成各类可视化组件。最后强调Qt数据可视化不仅是技术实现,更是讲述数据故事的有效工具,开发者应根据需求复杂度选择合适的方法论。全文为开发者提供了全面的Qt数据可视化开发指南。

2025-11-07 11:39:38 948

原创 Qt多线程编程深度解析:对象线程关联性详解

在Qt中,每个QObject实例都有一个"线程关联性"(thread affinity),即对象"属于"哪个线程。线程关联性决定了:对象在哪条线程上接收和处理事件对象在哪条线程上执行信号槽调用对象在哪条线程上执行定时器事件。

2025-10-30 17:09:52 862

原创 详解 QGridLayout:Qt的网格布局管理器

QGridLayout 是 Qt 框架中的一个布局类,它将可用空间划分为行和列的网格,并将每个部件放置到指定的单元格中。与 QHBoxLayout 和 QVBoxLayout 相比,QGridLayout 提供了更精细的布局控制能力。

2025-10-28 15:32:41 592

原创 Qt委托类概念及应用详解

Qt委托类是模型/视图架构中负责数据展示和编辑的关键组件。它通过重写核心函数(如paint()、createEditor()等)实现数据的可视化呈现和交互式编辑。委托类充当数据"中介",能将原始数据转换为进度条、星级评分等直观形式,同时提供合适的编辑控件(如下拉框、滑块)。其工作流程包括:创建编辑器、加载数据到编辑器、保存编辑结果回模型。通过继承QStyledItemDelegate并选择性重写函数,开发者可灵活定制数据显示和编辑方式,如表格中的颜色选择器、星级评分等复杂交互元素。

2025-10-28 09:34:05 1190

原创 C++枚举深度解析:从传统枚举到现代枚举类

枚举是一种用户定义的类型,用于将整数值与有意义的名称关联起来。想象一下,如果没有枚举,我们可能会这样写代码:// 不推荐的做法// 0表示停止,1表示运行,2表示暂停// 运行逻辑这种"魔法数字"让代码难以理解和维护。枚举解决了这个问题:// 使用枚举// 运行逻辑优先使用enum class:获得更好的类型安全性和作用域控制指定底层类型:确保跨平台的存储一致性避免隐式转换:使用static_cast进行显式转换为位标志枚举提供运算符重载:提高代码可读性实现字符串转换函数。

2025-10-27 13:51:33 811

原创 Linux平台使用Qt进行DHCP自动获取网络配置

本文介绍了在嵌入式Linux系统中使用Qt框架实现DHCP自动获取网络配置的完整方案。主要内容包括:1. 选用轻量级udhcpc作为DHCP客户端,解析其配置脚本处理不同状态;2. 详细讲解DHCP客户端脚本,包括IP地址分配、路由设置和DNS配置等功能;3. 在Qt中集成DHCP功能,通过系统调用和文件解析获取网络配置;4. 提供完整的实现流程,包括脚本创建、权限设置和Qt模块开发;5. 分析关键技术点和常见问题解决方法。该方案具有轻量高效、功能完整的特点,特别适合嵌入式设备等需要自动网络配置的应用场景。

2025-10-18 16:41:26 1063

原创 C/C++——整数提升

整数提升是 C/C++ 标准中规定的一种隐式类型转换规则。它的核心内容是:在表达式中,凡是使用到整数类型(包括有符号和无符号)的“位宽”小于int的类型(如charshortbool等)的值,都会首先被自动转换为int类型(或者,如果int无法表示其所有值的话),然后再参与计算。这个转换过程是自动的、隐式的,由编译器在编译代码时完成。特性描述触发条件表达式中使用了位宽小于int的整数类型(charshortbool等)。提升目标int或(绝大多数情况是int提升方式有符号数符号扩展,无符号数零扩展。

2025-10-17 17:23:21 904

原创 关于tar包的一些问题记录

tar解压不会删除同名文件夹中多余的文件,因为:这是设计上的安全特性,防止意外数据丢失tar的定位是归档工具,不是同步工具这种保守的行为保护了用户已有的数据如果需要精确同步,需要额外的使用一些命令进行操作或使用专门的同步工具。

2025-10-17 16:44:53 422

原创 Visual Studio 2019 编码设置

于开发时,使用VS2019的平台开发,但是使用中文注释上传git,会导致git识别编码错误,导致所有中文注释都是乱码,需修改VS2019平台的编码设置。一般情况下,git平台所使用的编码为UTF-8,只需将VS2019的文件编码改为UTF-8即可。修改如下。

2025-09-29 09:45:18 522

原创 Qt中setFocus与show顺序问题

摘要:排查Qt控件setFocus()导致段错误的问题时,发现根本原因是函数调用顺序错误:先调用setFocus()后show()。深入分析表明,Qt控件必须已显示并拥有有效的窗口句柄才能设置焦点。窗口句柄是操作系统级别的窗口标识符,在父控件显示时才会创建。即使单独show()子控件,若父控件未显示,子控件也无法获得有效句柄。解决方案包括:1)先显示父控件再设置焦点;2)使用定时器延迟设置;3)重写showEvent。调试时可检查winId()验证句柄状态。核心原则是:确保父控件先显示,再操作子控件焦点。

2025-09-18 18:53:29 770

原创 unique_ptr是什么?如果在C++中自己实现unique_ptr,应当如何实现?

是 C++11 引入的一种智能指针。它拥有对其所指向对象的独占所有权唯一所有权:在任何时刻,只有一个unique_ptr实例可以拥有一个给定的对象。自动销毁:当unique_ptr被销毁(例如离开作用域)时,它所拥有的对象会自动被删除,其内存会被释放。移动语义:虽然unique_ptr不能被复制,但所有权可以通过移动语义(Move Semantics)安全地转移给另一个unique_ptr。它的主要目的是替代new和delete,管理对象的生命周期,从而有效防止内存泄漏,并明确表达代码的所有权语义。

2025-09-18 09:55:35 1027

原创 shared_ptr是什么?如果在C++中自己实现shared_ptr,应当如何实现?

分配的动态内存,若传入栈内存地址,会导致程序崩溃(尝试释放栈内存)。互相引用,会导致引用计数无法减至 0,从而造成内存泄漏。比普通指针有轻微的性能开销,不适合对性能极端敏感的场景。引用计数的增减需要原子操作(线程安全),因此。,其核心作用是实现动态内存的。(C++11 引入)创建。,从而自动避免内存泄漏。(弱指针)打破循环,

2025-09-18 09:48:36 1073

原创 分辨率与帧缓冲(Framebuffer)内存的关系

摘要:Qt界面开发中,分辨率直接影响内存占用。帧缓冲显存占用与分辨率成正比(计算公式:宽×高×每像素字节数),如1080p比720p多占约4.5MB。位图资源在高分辨率下内存消耗更大(全屏背景图从1.5MB增至8.3MB),建议采用矢量图形或动态缩放优化。高分辨率还易导致界面控件增多和图形特效(抗锯齿/阴影等)临时缓冲需求增加,进一步抬升内存消耗。嵌入式系统需特别注意显存与内存共享带来的压力。

2025-09-13 13:29:03 465

原创 system() 和 popen()

C/C++标准库中的system()和popen()函数都用于执行外部命令,但存在重要区别:system()简单执行命令并返回状态码,适合不需要交互的场景;popen()则通过管道实现进程间通信,支持单向数据流(读取命令输出或写入输入)。system()更简单直接但功能有限,popen()更灵活但开销较大。使用时需注意命令注入风险,避免直接使用未处理的用户输入。根据是否需要处理命令输入/输出数据来选择合适函数。

2025-09-12 14:13:40 699

原创 ttf文件字体裁剪

本文介绍了如何通过FontSubsetGUI工具裁剪字体文件以节省嵌入式设备内存空间。操作步骤包括:选择源字体、设置输出路径、准备字符列表文本文件(UTF-8编码可选),最后点击执行即可生成裁剪后的精简字体文件。该方法特别适合内存受限的嵌入式系统开发。

2025-09-11 16:02:56 261

原创 QT界面UI卡顿、崩溃

故,我们可在一些工业级项目中的子控件中,看到该控件的paintEvent函数中查看到有异步刷新操作,而异步刷新是在一个全局绘画管理器(GlobalPaintManager)中执行,在这个管理器中,使用继承自父类的函数,并重写该函数定时去处理异步刷新,这是一种处理上述跨线程调用GUI操作的方式。直接去设置子控件的大小,而在这里,是直接在串口线程调用控件的的函数,在函数中使用子控件的update()函数,看起来是调用函数,但究其底层,仍是串口线程去跨线程调用GUI,执行update操作。

2025-09-11 14:43:36 343

原创 嵌入式设备中Qt的事件分析

ApplicationQtTouch DeviceApplicationQtTouch Device原生触摸事件QTouchEvent (原始事件)QMouseEvent (合成事件)通过理解设备差异并合理配置 Qt 属性,可确保应用在各种触摸屏上获得一致的行为。// 默认启用的全局属性(可在 main() 中修改)在 Qt 中,触摸输入触发不同类型事件(:被识别为通用鼠标设备,生成标准鼠标事件。// Windows 启用原生触摸。// 配置 XInput 触摸协议。// 忽略由触摸合成的鼠标事件。

2025-09-11 14:25:49 812

原创 在Qt中处理事件的两种方式:事件过滤器 vs 重写event函数

而对于子控件事件,事件过滤器提供了非侵入式的解决方案。// 自身事件直接在event函数中处理。// 监控子控件事件(使用事件过滤器)在父窗口区域触摸的场景中,由于事件属于窗口自身且需要访问窗口状态,重写。在Qt中处理事件主要有两种方式:使用事件过滤器(事件过滤器(eventFilter) vs 重写event函数。// 处理子控件触摸事件。// 处理自身触摸事件。2. 处理自身事件 → 重写event函数。1. 处理子控件事件 → 使用事件过滤器。:触摸事件发生在父窗口上,而不是子控件。

2025-09-11 14:23:40 1222

原创 关于QString转为本地编码C字符串后出现悬空指针的问题

但打印这个nameStr时,出现打印空白的情况,经过查阅资料,了解到,toLocal8Bit() 返回的是临时 QByteArray 对象,在语句结束后立即销毁,此时 data() 返回的指针会指向已释放的内存(悬空指针),导致未定义行为(如数据损坏或崩溃)。使用该方式,会进而出现一个问题,该函数会被调用多次,每一次调用都会创建内存到堆区,即newStr会分配新内存,并将nameStr指向新内存,此时问题为,旧内存未被释放,在多次调用后堆内存中残留大量未释放的旧字符串,最终可能导致程序内存耗尽。

2025-09-11 14:11:49 564

原创 Qt字体占用内存过大解决方案

(3)两者区别之三为,繁体软件所使用的主板拥有扩展芯片,分析是否因扩展芯片及扩展芯片程序,导致占用CPU使用率,进而导致占用内存。因GUI应用程序,为了方便显示字符,会提前将字体导入程序缓冲区中,并在程序的堆区中创建字体及渲染,且因繁体的复杂程度比简体的高,导致堆区内存占用过大。解决方式2,使用字体度量与渲染复杂度更小的繁体字库,重新查找字体文件,最终找到一个TaibeiHeiti.ttf字体文件,该文件字体度量与渲染复杂度更小,运用在程序上,明显内存占用减低。将两者的区别进行比较,并排查问题。

2025-09-11 13:59:51 600

字体文件ttf裁剪工具

1、点开FontSubsetGUI.exe 2、Source Font选择为你自己所需的源字体库。 3、New Font为你自己想保存导出的字体库。 4、Char List为对照文件,需要txt格式,可将所用到的所有字符放入这个txt,然后选择这个txt文档。 5、Encoding为格式设置,一般UTF-8即可,若不知道,可不指定。 6、点击Proceed,即可导出。 注意,只能ttf文件

2025-09-11

空空如也

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

TA关注的人

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