自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【架构级实战】告别硬编码:基于 Qt/C++ 的表驱动式工业串口通信通用框架详解

本文介绍了一种基于Qt/C++的表驱动式工业串口通信框架,通过五层解耦模型实现业务逻辑与底层协议的彻底分离。该框架采用强类型枚举确保类型安全,利用内存对齐实现零拷贝封包,将巡检任务定义为静态列表实现"数据定义行为"。核心引擎层作为通用处理循环,只需修改配置表即可扩展新指令,无需改动底层代码。这种架构具有高内聚性、强扩展性和易维护性,有效解决了传统硬编码方式存在的魔术数字、维护困难和扩展性差等问题。

2026-01-29 00:49:47 739

原创 【Qt实战】工业级多线程串口通信:从底层协议设计到完美收发闭环

本文总结了一套工业级Qt多线程串口通信架构,解决了常见开发痛点。首先强调对象依附性(Thread Affinity)问题,指出对象必须在其"户口"所在线程操作,并给出正确实例化方式。其次,通过#pragma pack和固定数据类型确保协议封包准确性。发送环节提出同步发送三部曲,包含强制发送(waitForBytesWritten)和节奏控制。最后展示了一个完整的run()循环架构,涵盖资源管理、同步收发、错误处理和优雅退出机制。文章还提供了偶校验算法等实用技巧,为工业控制领域的串口通信开

2026-01-29 00:19:03 835

原创 Qt 线程为什么和 Linux pthread 不一样?事件循环、QObject 线程归属与串口上位机正确架构

Qt线程与Linux pthread的主要差异在于事件循环和QObject线程归属机制。Qt推荐单一线程独占QSerialPort对象,通过信号槽与UI线程通信,而非传统Linux中收发分离的多线程模型。这是因为Qt采用事件驱动I/O(类似epoll),且QObject必须在其所属线程中操作。对于串口上位机开发,建议采用三层架构:GUI线程负责UI、专用I/O线程处理串口通信、可选解析线程处理数据。这种设计避免了多线程直接操作QObject的风险,同时利用事件循环机制实现高效通信。

2026-01-22 21:17:18 801

原创 Qt 启动时序与事件循环:为什么监控启动不要放在构造函数里,以及 `QTimer::singleShot(0, ...)` 到底做了什么

本文深入解析了Qt程序启动时序与事件循环机制的关键问题。首先阐明a.exec()实质是启动GUI线程事件循环,负责处理各类事件。文章指出常见误区:启动监控代码不应放在构造函数中,因为此时事件循环未启动且窗口未稳定,容易导致时序问题。重点分析了QTimer::singleShot(0,...)的作用机制,其0延时并非立即执行,而是将任务排入事件队列等待循环启动后尽快处理。最后给出工程建议:采用两阶段初始化,在exec()前通过singleShot延迟执行监控启动,并推荐单线程独占I/O的架构模式。正确理解这些

2026-01-21 19:08:17 939

原创 epoll 学习记录:ET 都“只通知一次”了,为什么还必须设置非阻塞?

摘要: ET(边缘触发)模式的核心特性是"只通知一次",要求必须一次性处理完所有可用数据。但关键在于必须配合非阻塞IO,原因在于: ET模式下,若未读空缓冲区,可能丢失后续通知 非阻塞IO通过EAGAIN错误码标识"读空"状态 阻塞模式下read/accept会卡死线程,无法实现"读空即停" 正确做法是:设置O_NONBLOCK标志,循环读写直到EAGAIN。这确保了既能完整处理数据,又不会阻塞事件循环。文章提供了可直接使用的ET模式代码模板和常见

2025-12-24 20:17:29 471

原创 Linux `epoll` 学习笔记:从原理到正确写法(含 ET 经典坑总结)

本文总结了Linux epoll的核心知识点与常见误区。首先对比了epoll与select/poll的性能差异,指出epoll通过内核维护就绪队列实现高效事件通知。接着详细解析epoll三大API的正确用法,包括epoll_create1参数设置、epoll_ctl操作和epoll_wait使用。重点分析了LT与ET模式的区别,强调ET模式必须配合非阻塞IO,必须循环读取直到EAGAIN。文章还提供了ET模式服务端的基本框架,并总结了7个常见坑点,如epoll_create1参数错误、非阻塞设置混淆F_SE

2025-12-24 20:10:21 958

原创 epoll 学习踩坑:`fcntl` 设置非阻塞到底用 `F_SETFL` 还是 `F_SETFD`?

摘要: 在使用epoll的ET模式时,必须正确设置文件描述符为非阻塞(O_NONBLOCK)。常见错误是误用fcntl的F_SETFD参数(用于设置文件描述符标志如FD_CLOEXEC)而非F_SETFL(用于设置文件状态标志如O_NONBLOCK)。错误操作会导致程序阻塞或事件丢失。正确写法应通过F_GETFL/F_SETFL设置非阻塞,并通过循环读取直到EAGAIN确保ET模式正常工作。推荐封装工具函数或使用accept4等现代接口直接设置标志,避免混淆。

2025-12-24 20:07:04 953

原创 深入理解 `poll` 函数:详细解析与实际应用

poll函数是一种高效的多路复用机制,用于监听多个文件描述符的状态变化。相比select,poll没有文件描述符数量的限制,更适合高并发场景。其核心是通过pollfd结构体数组来管理监听事件,支持精确的超时控制。典型应用包括网络服务器处理多客户端连接,通过轮询检查文件描述符状态,避免阻塞问题。示例代码展示了如何用poll实现基本的服务器功能,包括接受新连接和处理客户端数据。poll在性能上优于select,尤其适合大规模并发连接的处理。

2025-12-11 21:06:40 603

原创 Linux_select多路复用及ioctl用法详解

本文介绍了使用select实现TCP服务器多路复用的核心原理与实现方法。主要内容包括: select的作用:解决阻塞I/O和多进程/线程开销大的问题,实现单线程监控多个socket。 select函数详解:参数含义、返回值说明,以及fd_set位图操作的原理。 服务器实现流程:通过主监听socket和客户端socket的协同处理,重点说明了为何需要readfds和testfds两个集合。 关键实现细节:包括监听socket的可读事件处理、客户端连接关闭的判断(使用ioctl的FIONREAD)以及selec

2025-12-09 12:44:05 636

原创 线程与进程的结束方式详解

本文系统总结了Linux下线程与进程的不同结束方式及其区别。进程的退出(exit/return/_exit)会终止整个程序,而线程的退出(return/pthread_exit)仅结束当前线程。关键区别在于:子进程必须调用exit以避免fork炸弹,而线程不能使用exit否则会终止整个进程。此外,线程结束后需要通过pthread_join回收或pthread_detach设置自动回收,否则会造成资源泄漏。这些机制在多进程/多线程服务器开发中尤为重要,正确使用才能确保程序稳定运行。

2025-12-02 11:31:17 1040

原创 大端、小端与网络字节序:你必须真正弄懂的底层知识

摘要: 字节序(Endianness)指多字节数据在内存中的排列方式,分为大端(高位在前)和小端(低位在前)。不同CPU架构(如x86小端、PowerPC大端)的字节序差异会导致网络通信数据解析错误。为确保兼容性,IETF规定网络字节序统一为大端。因此,网络编程中必须使用htons/htonl将本机整数转换为大端发送,接收时用ntohs/ntohl转回本机字节序。字符串IP无需转换,仅整数类型受影响。这一机制是跨平台网络通信的基础,避免端口、IP等关键信息解析错误。

2025-12-02 10:33:17 907

原创 为什么 TCP 服务端重启会出现 “Address already in use”问题解析

TCP服务端重启时出现"Address already in use"错误的原因是端口处于TIME_WAIT状态。这是由于TCP断开连接时主动关闭方会保持该状态30秒到2分钟,确保可靠断开。解决方法是在bind前设置SO_REUSEADDR选项,允许端口复用。这是Nginx、Redis等服务器的标准做法,解决了服务端快速重启的问题。核心要点:TIME_WAIT导致端口延迟释放,SO_REUSEADDR允许立即复用端口。

2025-12-02 10:26:31 388

原创 Linux文件套接字AF_UNIX

UNIX域套接字(UDS)是Linux中基于文件系统路径的进程间通信机制,与网络套接字API类似但更高效。它使用AF_UNIX地址族,通过文件路径(如/tmp/server.sock)标识通信端点,仅支持本机进程通信。相比网络套接字,UDS不经过网络协议栈,速度更快且可通过文件权限控制访问安全。典型应用包括Nginx与PHP-FPM通信、Docker守护进程接口等。示例展示了C语言实现的UDS服务端和客户端基本流程:创建套接字、绑定路径、监听连接及数据传输,最后需删除套接字文件。UDS适合高性能本地IPC,

2025-11-29 10:23:29 1019 1

原创 进程通信与线程通信:全面总结 + 使用场景 + 优缺点 + 使用方法

本文系统总结了Linux下进程与线程的通信方式。线程通信主要依靠共享内存和同步机制,包括全局变量、互斥锁、信号量、条件变量、读写锁和屏障等6种方式,各有适用场景和优缺点。进程通信需要借助内核IPC机制,按复杂度从低到高分为8种:匿名/命名管道、消息队列、共享内存、信号量、信号、套接字和mmap文件映射。文章对比了两类通信方式的差异,并给出选型建议:线程通信优先使用共享变量和互斥锁,进程通信根据场景选择共享内存(大数据)、UNIX域套接字(本地)或TCP/IP(跨主机)等方案。

2025-11-29 10:04:53 833

原创 Linux线程取消详解

pthread_cancel是POSIX线程库提供的线程取消机制,它通过发送取消请求而非强制终止线程来实现优雅退出。线程通过pthread_setcancelstate设置可取消性(默认允许),通过pthread_setcanceltype设置取消类型(默认延迟取消)。在延迟取消模式下,线程只会在取消点(如sleep、I/O操作等)检查并响应取消请求。被取消的线程会执行清理函数释放资源,并通过pthread_exit(PTHREAD_CANCELED)退出。典型实现包括:设置取消参数、在循环中插入取消点、使

2025-11-25 20:03:48 311

原创 Linux线程属性详细解析

本文介绍了POSIX线程属性(pthread_attr_t)的使用方法,主要包括五个方面:1)线程属性对象的基本用法流程;2)线程分离状态(joinable/detached)的设置方式及适用场景;3)线程栈相关属性的配置,包括栈大小、位置和保护区设置;4)线程调度策略(SCHED_OTHER/FIFO/RR)和优先级的设置要点;5)线程竞争范围的冷门属性。文章通过代码示例详细说明了如何正确设置这些属性,特别强调了容易被忽略的调度继承问题(PTHREAD_EXPLICIT_SCHED)。最后提供了一个综合示

2025-11-25 18:58:29 412

原创 深入理解条件变量(Condition Variables):概念、使用场景与实践

条件变量(Condition Variable)是多线程编程中的一种同步机制,通常与互斥锁一起使用,用于线程间的协调与通信。它允许线程在某些条件未满足时挂起自己,释放互斥锁,并等待其他线程的通知,直到条件满足后继续执行。通过这种机制,线程能够高效地进行同步,避免了忙等待和不必要的资源消耗。

2025-11-23 21:10:26 876

原创 深入浅出:Linux 线程的互斥与同步

本文介绍了Linux系统中线程的互斥与同步机制。主要内容包括: 线程基本概念及多线程编程中的竞态条件问题; 互斥的概念及实现方式(互斥锁、信号量),提供互斥锁代码示例; 同步的概念及实现方式(条件变量、信号量),提供条件变量同步示例; Linux中互斥与同步的主要工具(互斥锁、条件变量、信号量)及其常用函数; 生产者-消费者问题的实现示例。 文章强调正确使用这些机制对开发高效稳定的并发程序的重要性,帮助读者掌握Linux多线程编程的基本同步技术。

2025-11-17 20:43:42 931

原创 Linux 进程间通信怎么选?——场景化决策指南

本文提供了Linux进程间通信(IPC)的选型指南,主要从场景化角度分析不同IPC方式的适用情况。文章首先列出了8个关键评估维度,如通信范围、数据形态、时延要求等。然后详细介绍了信号、管道、消息队列、共享内存、套接字等主要IPC方式的特点和适用场景。通过对照表形式给出了典型场景的推荐方案,如父子进程通信推荐匿名管道,跨主机通信必须使用网络套接字等。此外还提供了常用组合模式、典型误用案例以及性能优化建议。最后总结了三个模板化决策路径,帮助开发者快速做出适合的技术选型。全文以实用为导向,旨在帮助开发者根据具体需

2025-11-12 20:38:49 626

原创 共享内存(Shared Memory)全指南:原理、API、示例、踩坑与调试

共享内存是Linux中最快的进程间通信方式,它允许多个进程直接访问同一块物理内存页,避免了内核与用户空间的拷贝开销。本文对比了System V和POSIX两套共享内存API:System V使用key_t标识共享内存段,适用于传统UNIX环境;POSIX采用命名对象方式,在/dev/shm可见,更易理解。两种方式性能优异,System V更系统化,POSIX更直观。文中提供了详细API说明和完整示例代码,包括System V的读写端实现和POSIX单进程演示,帮助开发者快速掌握共享内存的使用方法和注意事项。

2025-11-12 10:50:10 1061

原创 Linux 进程通信与同步机制:共享内存、内存映射、文件锁与信号量的深度解析

本文深入解析Linux系统中四种关键的进程通信与同步机制:共享内存、内存映射、文件锁和信号量。共享内存是最快的进程通信方式,通过内核分配的物理内存实现数据共享;内存映射将文件内容映射到进程地址空间,实现高效文件I/O;文件锁用于保护文件访问安全,防止并发写入冲突;信号量作为通用的同步原语,可控制任意资源的并发访问。文章详细对比了这些机制的区别与适用场景,并给出实践建议:共享内存+信号量适合进程协同,内存映射优化文件I/O,文件锁保护文件安全,信号量适用于通用同步需求。理解这些机制是掌握Linux并发编程的核

2025-11-10 19:13:44 379

原创 信号量与 PV 操作:一篇从入门到实战的全指南

本文全面介绍了信号量及其PV操作的原理与应用,重点解析了Linux系统中的三类信号量实现方式。信号量本质是一个受内核保护的整数计数器,用于协调多进程/线程对共享资源的访问。文章通过面馆碗的比喻形象说明PV操作机制,并详细对比System V信号量、POSIX无名信号量和POSIX命名信号量的特性及适用场景。针对每种信号量类型,提供了完整的代码模板、使用注意事项和常见问题解决方案。其中,System V信号量适用于传统跨进程互斥/同步场景,POSIX无名信号量更适合线程间同步,而POSIX命名信号量则简化了跨

2025-11-10 18:54:56 1164

原创 Linux 管道(pipe/FIFO)全指南:概念、语义、原子性、阻塞规则、实战代码与最佳实践

本文全面介绍了Linux管道的概念与应用,涵盖匿名管道(pipe)和命名管道(FIFO)的创建、使用及底层机制。文章详细解析了管道的半双工特性、原子写入规则(PIPE_BUF)、阻塞/非阻塞模式、EOF处理以及容量调整方法。同时提供了Shell管道实现原理和C语言代码示例,包括dup2重定向、SIGPIPE信号处理、多路复用监控等技术要点。此外还介绍了pipe2系统调用、双向通信实现方案以及与stdio库的配合使用方法,最后提及splice/tee等零拷贝技术。本文既包含基础概念讲解,又提供实际开发中的最佳

2025-11-08 12:22:13 673

原创 Linux 进程通信(IPC)一站式笔记:概念 → 常用方式 → 函数原型与参数详解

本文主要介绍Linux进程间通信(IPC)的概念与实现方式。首先解释了进程隔离的必要性和IPC的作用,列举了典型应用场景。随后概述了7种常用IPC方式及其特点,包括信号、信号量、管道、共享内存等,并对比了它们的适用场景和复杂度。 文章重点详细讲解了信号机制,涵盖信号分类、发送方式(kill系统调用)、处理函数设置(signal和sigaction),以及相关标志位的作用。通过代码示例演示了信号处理过程,包括可重启系统调用的实现方法。最后提供了常见信号的编号、默认行为速查表,便于开发者快速查阅。

2025-11-04 18:35:58 1308

原创 一文吃透 Linux 进程:从 PID、PCB 到僵尸回收、fork/exec、守护进程

本文全面介绍了Linux进程管理的核心概念与实践技巧。主要内容包括:进程基本概念(PID/PPID/PCB)、进程状态与生命周期管理(fork/exec/exit/wait)、僵尸进程的成因与解决方案、信号处理与环境变量操作、I/O重定向与管道通信、守护进程创建的关键步骤,以及进程调度优先级相关的nice值和实时调度策略。文章还提供了常用监控工具(如ps/top/strace/lsof)和最佳实践建议(如正确处理SIGCHLD信号避免僵尸进程)。通过代码示例演示了核心系统调用的正确用法,帮助读者掌握Linu

2025-11-03 20:54:26 663

原创 一次搞懂 `const`:从变量到函数、从指针到对象的“只读承诺”

本文系统梳理了C++中const关键字的用法,核心要点包括: 基础语法:const的位置决定保护对象,左const保护数据,右const保护指针; 使用技巧:采用"右往左读"方法解析复杂指针声明; 函数应用:成员函数后加const保证不修改对象状态; 设计原则:区分读写接口,只读接口返回const引用; 常见误区:字符串字面量赋值、遗漏成员函数const修饰等; 进阶概念:与constexpr、volatile的对比。 文章提供了实用口诀、类型解析方法和最佳实践建议,帮助开发者正确使用c

2025-11-02 15:52:50 1006

原创 深入理解 Linux 内存映射:使用场景、与传统 I/O 的区别及最简单的例子

本文介绍了Linux内存映射技术(mmap)的基本概念、使用场景及其与传统I/O的区别。内存映射通过将文件内容映射到进程虚拟内存空间,使文件能像内存一样直接访问,提高了大文件处理和进程间通信的效率。文章对比了内存映射与传统I/O在数据流动、访问方式、内存消耗和性能上的差异,并提供了简单的C++示例展示如何实现文件内存映射和修改。内存映射适用于数据库管理、大数据处理、进程通信和硬件访问等场景,是优化文件操作性能的重要技术。

2025-10-28 10:53:33 625

原创 FTP 和 SFTP:作用、使用场景及详细使用教程

FTP和SFTP是两种常用的文件传输协议,分别适用于不同场景。FTP基于明文传输,速度快但安全性低,适合局域网或公开数据交换;SFTP通过SSH加密传输,安全性高但速度较慢,适合敏感数据远程传输。安装方面,FTP需配置vsftpd服务,SFTP依赖SSH服务。用户可通过命令行或图形工具(如FileZilla)进行文件传输操作。根据安全需求选择合适协议,FTP适用于非敏感数据快速传输,SFTP则提供加密保护,适合关键数据交换。

2025-10-20 18:05:27 1448

原创 虚拟机网络配置:从零到解决网关配置问题的保姆级教程

摘要: 本文详细介绍了虚拟机网络配置中网关错误的排查与解决方法。当虚拟机无法访问外部网络时,通常是由于网关配置错误。教程从网关概念入手,指导用户通过ipconfig(Windows)或ip route(Linux)获取宿主机网关,并在虚拟机中通过命令行或修改netplan配置文件设置正确网关。最后通过ping测试验证连接,涵盖宿主机、网关和外部网络的连通性检查,同时提供防火墙和DNS问题的解决建议,帮助用户彻底解决虚拟机网络访问问题。(150字)

2025-10-14 11:50:25 817

原创 如何在 Linux_Ubuntu 上安装 Qt 5:详细教程

摘要: 本文详细介绍了在 Ubuntu 系统上安装 Qt 5 的两种方法:通过 apt 安装基础版本或使用 Qt 官方安装器 自定义安装。教程涵盖环境准备、依赖项安装、环境变量配置,并演示如何通过 Qt Creator 或命令行创建和编译 Qt 项目。还提供了常见问题(如 qmake 缺失、Qt Creator 启动失败)的解决方案,帮助开发者快速搭建 Qt 5 开发环境。适合 Ubuntu 20.04/18.04 用户参考。

2025-10-11 22:36:26 2997

原创 Linux Shell 脚本:从零到进阶的实战笔记

本文介绍了Linux Shell脚本的基础知识和进阶技巧,包括执行方式、变量操作、运算判断、流程控制、函数编写、递归实现、数组使用和文件I/O处理。重点讲解了Shebang语法、变量弱类型特性、位置参数、算术字符串运算、分支循环结构、函数返回值机制、递归算法实现,以及数组操作和文件读写方法。文章还总结了常见错误点,如大小写敏感、until循环语义、数组遍历引号使用等注意事项,帮助开发者避免常见陷阱。通过大量实用代码示例,系统性地展示了Shell脚本从入门到进阶的核心知识点。

2025-09-23 23:44:55 988

原创 Linux 系统文件目录超详解

Linux 系统文件目录结构详解 本文全面介绍 Linux 文件系统层次标准(FHS)和现代发行版的目录结构变化。主要内容包括: FHS 标准:解释 /etc、/var、/home 等核心目录的用途,以及 usrmerge 趋势带来的变化。 关键目录详解: /etc:系统配置中心 /usr 与 /usr/local:系统与本地安装程序的区别 /var:日志、缓存等可变数据 /proc、/sys、/dev:系统与设备信息接口 发行版差异:对比 Debian/Ubuntu、RHEL/CentOS 和 Arch

2025-09-22 20:14:03 1062

原创 VMware Workstation Pro 虚拟机为 Ubuntu 18 配网教程

本文介绍了如何在VMware Workstation Pro中为Ubuntu 18配置网络的详细教程。主要内容包括: 网络环境准备:建议避免使用校园网,优先选择手机热点等可控网络 确认主机网卡信息:通过Windows设置查看当前使用的网卡类型 VMware桥接设置:配置VMnet0桥接网络并选择对应物理网卡 Ubuntu网络配置:使用Netplan配置静态IP,确保与主机同网段 SSH远程访问:解决Ubuntu 18.04软件源过期问题,提供IPv6/IPv4两种方案 教程提供了完整的命令和截图指引,重点解

2025-09-21 21:40:49 1003

原创 从零到一:用 Qt + libmodbus 做一个**靠谱**的 Modbus RTU 小工具(实战总结)

本文总结了使用 Qt 和 libmodbus 开发 Modbus RTU 工具的实战经验,提供了协议速查表、代码模板和易错点清单。主要内容包括:Modbus RTU 协议基础(四类数据区、功能码、地址规范)、Qt 工程结构设计、串口连接关键步骤、读写 API 调用示例、输入/输出数据处理方法。文章特别强调了 Windows 下 COM 端口命名、地址偏移、返回值校验等常见陷阱,并给出了 RAII 封装、错误处理、线程模型等工程化建议。最后推荐了调试流程:先用第三方工具验证设备通信,再逐步测试工具功能。

2025-09-15 20:12:51 1199

原创 Windows 串口名“\\.\COMx”的那些坑:一次 Modbus 读数失败的完整复盘

Windows串口编程避坑指南:当使用COM10及以上端口时,必须添加\\.\前缀(源码中需转义为"\\\\.\\COM41")。本文详细分析了这一问题的根源,提供了不同场景下的正确写法,包括C源码、命令行参数和JSON配置等。同时给出了一个完整的Modbus读数示例代码,封装了端口名规范化处理,并包含调试日志、超时设置等稳定性措施。最后总结了排查顺序:先确认端口名格式正确,再检查从站地址、寄存器偏移、功能码等常见问题点。

2025-09-09 12:48:26 1142

原创 Modbus 速查与实战笔记(功能码、帧结构、坑点)

Modbus速查与实战笔记摘要 Modbus是工业领域主从式通信协议,支持RTU/ASCII(串口)和TCP(以太网)两种传输方式。核心数据模型包括4类寄存器(线圈、离散输入、保持寄存器、输入寄存器),通过功能码控制读写。常用功能码如03(读保持寄存器)、06(写单个寄存器)等需重点掌握。 关键要点: 地址偏移:协议中使用零基地址,但设备文档可能标注为1基(如40001),需实测验证。 字节序:寄存器默认大端,但跨寄存器组合时需注意字序问题。 调试技巧:串口需检查物理层(如RS-485极性、终端电阻),TC

2025-09-09 11:38:09 1215

原创 *解决 Visual Studio 编译时的字符编码问题

本文分析了Visual Studio编译时出现中文字符乱码的问题及解决方案。主要原因是Qt Creator默认使用UTF-8编码,而Visual Studio可能使用不同编码,导致中文字符解析错误。解决方案包括:1)在Visual Studio中设置UTF-8编码;2)启用UTF-8 BOM格式;3)使用文本编辑器检查清理无效字符;4)避免跨环境复制中文字符代码。建议统一使用UTF-8编码并启用BOM,以解决跨平台开发中的字符编码问题。

2025-08-25 14:08:15 1203

原创 Qt 动态属性(Dynamic Property)详解

本文介绍了Qt中的动态属性(Dynamic Property)机制及其应用。动态属性允许开发者为QObject派生类对象在运行时添加自定义键值对,相当于为控件添加"标签"。文章阐述了动态属性的四大使用场景:1)存储控件关联的额外信息(如数据库ID);2)作为状态标记;3)配合QSS控制UI样式;4)区分同类控件的不同功能角色。通过图书管理系统的代码示例,展示了如何利用动态属性简化控件与数据的关联逻辑。作者建议动态属性应作为UI层与业务逻辑的"粘合剂",而非存储核心业务

2025-08-16 22:31:00 1318

原创 C++ Qt 成员对象初始化与 TCP 长连接问题深度解析

本文深入解析了C++ Qt开发中TCP长连接与对象初始化的核心问题。首先对比了栈对象、堆对象和类成员对象的区别:栈对象生命周期短,不适合长连接;堆对象由new创建,适合动态管理;成员对象与类实例同生命周期,适合窗口绑定长连接。重点讲解了初始化列表的必要性,指出成员对象必须在初始化列表构造,若在构造函数体内尝试重构造会导致错误。最后给出实践建议:TCP长连接应使用成员对象或堆对象,优先在初始化列表完成构造。通过厘清对象存储位置、生命周期和构造顺序,帮助开发者避免常见错误,构建稳定的TCP连接。

2025-08-15 00:37:00 689

原创 C++ 左值与右值:通俗易懂的全面解析

本文摘要:C++中的左值和右值概念是理解引用、移动语义等特性的基础。左值指有持久内存地址的对象,可取地址且生命周期较长;右值指临时对象或字面量,不可取地址且生命周期短。C++11进一步细化了分类,包括xvalue、prvalue等。左值引用(T&)只能绑定左值,右值引用(T&&)用于移动语义。常见错误包括非常量引用绑定右值,而常量引用可绑定右值。理解左值/右值有助于避免函数参数传递、临时对象析构等问题,是掌握现代C++特性的关键。

2025-08-15 00:15:25 1029

空空如也

空空如也

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

TA关注的人

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