自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

Linux C语言网络编程入门教程摘要 本文详细讲解了如何使用C语言在Linux下实现TCP网络通信,涵盖服务端和客户端的完整开发流程。主要内容包括: 基础概念:Socket作为通信接口的作用,IP地址和端口的意义,TCP通信流程(三次握手) 核心步骤: 创建Socket(socket) 服务端绑定端口(bind) 设置监听(listen) 接收连接(accept) 客户端连接(connect) 数据收发(read/write) 关闭连接(close) 关键技术点: 字节序转换(htons/htonl) 地

2025-06-09 18:24:47 1309

原创 理解大端与小端字节序——原理、实践与网络编程

摘要: 字节序(大端/小端)是计算机存储多字节数据的顺序差异,大端优先存高字节,小端相反。网络通信统一使用大端序(网络字节序),而多数现代设备本地为小端序。实际编程需通过htonl/ntohl等函数转换字节序,确保数据传输正确性。理解字节序对调试网络协议、分析内存数据至关重要,单字节类型不受影响。核心原则:网络通信前强制转为大端序,本地处理用主机序,避免歧义。

2025-06-09 12:00:16 971

原创 深入理解 Socket 的底层原理

本文系统深入地阐述了操作系统中 socket 的底层原理,包括 socket 的本质和数据结构、与内核协议栈的协作方式、缓冲区的管理机制、典型通信流程、I/O 模型、资源管理与状态转换以及跨平台与扩展性等内容。文章通过对内核结构体、API 调用过程和协议栈数据流的详细解析,帮助读者理解 socket 如何作为“通信端点”实现高效可靠的数据交换。通过这些原理性讲解,读者能够掌握网络应用高效开发的基础,提升对操作系统网络子系统的整体认知。

2025-06-09 10:18:37 717

原创 什么是 Socket?一篇彻底通俗易懂的详解

本文以通俗易懂的方式,系统介绍了计算机网络编程中至关重要的“socket”概念。文章首先通过生活中的信箱比喻,帮助读者直观理解 socket 的作用和意义;随后深入剖析了 socket 的技术本质及其与操作系统、文件描述符之间的关系。文中详细阐述了 socket 在网络通信中的角色、基本使用流程(包括服务端和客户端的标准编程步骤)、常见类型(如 TCP 和 UDP socket)、底层实现原理,以及 socket 在实际开发中的典型应用场景。通过形象的比喻、精简的代码示例和常见问题解答,帮助初学者从零基础快

2025-06-09 10:07:42 594

原创 彻底理解大端字节序、小端字节序与网络字节序

摘要: 字节序指多字节数据在内存中的存储顺序,分为大端(高位字节在低地址)和小端(低位字节在低地址)。网络通信统一采用大端字节序(网络字节序)以确保跨平台兼容。实际应用中,需通过htonl、ntohl等函数转换主机序与网络序。字节序影响网络编程、二进制文件处理及数据解析,理解其原理(如小端仅字节顺序反转)是避免数据错乱的关键。记忆口诀:“小端低字节先存,大端高字节先存”。

2025-06-09 09:23:02 337

原创 Qt 开发中的父类与父对象的区别和父对象传递:如何选择 `QWidget` 或 `QObject`?

Qt 开发中父对象选择指南 在 Qt 开发中,合理选择父对象对内存管理和功能实现至关重要。核心原则是: GUI 开发:传递 QWidget 作为父对象,适用于所有图形控件,自动管理显示和生命周期 非 GUI 功能类:传递 QObject 作为父对象,利用信号槽机制和基础生命周期管理 关键区别:父类决定行为,父对象决定生命周期。正确选择可避免内存泄漏,简化代码维护。

2025-06-05 22:04:58 1045

原创 程序的运行过程与底层原理

程序的运行过程与底层原理 计算机程序的执行涉及多个关键步骤:编写源代码→编译→生成目标文件→链接→生成可执行文件→执行程序。 源代码编写:程序员使用高级语言(如C)编写代码,定义程序逻辑。 编译:编译器将源代码转换为机器语言,经过预处理、词法分析、语法分析等阶段生成目标文件(.o),内含二进制指令和符号表。 链接:链接器合并目标文件及库(静态链接直接嵌入代码,动态链接运行时加载),解析符号并重定位地址,生成可执行文件。 执行:操作系统加载可执行文件到内存,CPU执行机器指令,程序运行并访问系统资源。 底层原

2025-06-05 20:26:54 1210

原创 Linux 常用命令与 Shell 简介

Linux Shell 与常用命令摘要 Shell 是 Linux 系统的命令行接口,用户通过它输入指令与系统交互。常见 Shell 包括 Bash(默认)、Zsh 和 Fish 等。Shell 接收用户命令后传递给内核执行,并返回结果。 核心命令 man:查看命令手册(如 man ls) su/sudo:切换用户或执行特权命令(su root,sudo apt install) ls:列出目录内容(ls -l显示详情,ls -a含隐藏文件) cd/pwd:切换目录(cd ~回主目录)或显示当前路径 mkd

2025-06-05 18:03:15 768

原创 理解继承与组合的本质:Qt 项目中的设计选择指南

摘要: 在Qt项目开发中,正确选择继承或组合关系至关重要。继承适用于“is-a”关系(如自定义控件继承父类),组合则适合“has-a/uses-a”场景(如模块间功能调用)。继承易导致高耦合和冗余,而组合更灵活、低耦合。通过“三问法”可快速判断设计方向:若类间无类型层级关系,仅需功能调用,应优先选择组合(如传递QMdiArea*而非继承主窗口)。合理运用二者能提升代码复用性、可维护性和模块化程度。

2025-06-04 18:29:34 969

原创 深度解析 Qt 最顶层类 QObject:继承关系与内存生命周期管理

本文深度解析了Qt框架中最顶层类QObject的核心机制。QObject作为所有Qt类的基类,通过父子对象树形结构实现自动内存管理,父对象销毁时会递归删除子对象,有效防止内存泄漏。文章详细阐述了QObject的继承体系、构造函数实现原理,以及父子关系的四大优势:简化内存管理、清晰对象层次、支持事件传播和保障信号槽安全。同时解释了继承类构造/析构顺序,以及信号槽机制与对象生命周期的关联。理解QObject的这些特性是掌握Qt编程的关键基础。

2025-06-03 21:16:10 1334

原创 Qt开发必知必会的核心类与模块详解

本文系统介绍了Qt开发中的核心类与模块,涵盖GUI开发、信号槽机制、事件处理、文件操作等关键内容。Qt提供丰富的跨平台开发组件,包括基础类(QObject、QString)、GUI控件(QWidget、QMainWindow)、信号槽通信、多线程(QThread)和网络模块(QNetworkAccessManager)等,这些类相互配合形成完整的应用开发框架。掌握这些核心知识能显著提升Qt开发效率,构建高性能跨平台应用。文章可作为Qt开发者的快速参考指南。

2025-06-03 19:02:10 1030

原创 C++ Map 查询时的两个小细节:`map[id]` 与 `map.value(id, nullptr)` 的区别

map[id]适用于你希望在查询时自动插入新元素的场景,尤其当你确定插入默认值是合理的情况下使用。需要小心它的自动插入行为,可能会导致不必要的元素插入。适用于你只想查询是否存在某个键,并且不希望修改map的场景。它能提供更加明确的行为,并避免不小心插入新元素。如果id不存在,返回默认值,而不会改变map的内容。

2025-03-16 17:32:08 608

原创 设计模式详解:提高代码复用性与可维护性的关键

抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定具体类。它适用于需要创建一组相关对象的场景,客户端通过工厂来获取一系列产品,而无需关心具体的产品类。设计模式是软件开发中经过多年实践验证的解决方案,它帮助我们解决常见的设计问题,提升代码的可维护性、可扩展性和可复用性。通过设计模式,我们可以减少开发中的重复工作和错误,同时提升系统的灵活性。创建型模式:关注如何创建对象,提供灵活的实例化方法。结构型模式:关注如何组织类和对象之间的关系,使得系统的结构更加清晰和高效。行为型模式。

2025-03-16 17:15:50 1006

原创 单例模式(Singleton Pattern)详解:确保类的唯一性

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来访问该实例。确保类只有一个实例。提供一个全局访问点,允许任何地方访问该唯一实例。

2025-03-16 17:08:38 1165

原创 深入理解 Qt 系统托盘图标:创建自定义的系统托盘图标类

在现代桌面应用程序中,系统托盘图标(通常位于任务栏右下角)是一个常见的交互方式。它为用户提供了快捷的操作界面,如显示应用程序、退出程序、查看通知等。在 Qt 中,类允许我们轻松地在系统托盘中添加图标并与用户交互。今天,我们将介绍如何创建一个自定义的系统托盘图标类,使其能够响应用户的点击事件,并显示一个右键菜单。我们创建了一个名为的类,继承自,并实现了一些附加功能,如响应用户的点击事件、弹出右键菜单等。在这篇博客中,我们创建了一个名为的自定义系统托盘图标类,它继承自设置托盘图标。

2025-03-15 17:09:17 909

原创 Qt 中工具窗体与普通窗体在任务栏中的区别

普通窗体(Main Window)普通窗体是应用程序的主要窗口,通常是用户与应用程序交互的主要界面。Qt 提供了类,用于创建和管理应用程序的主界面。菜单栏:通常包含应用的文件、编辑、视图等菜单项。工具栏:包含常用的工具按钮。状态栏:用于显示应用的状态信息(如进度条、提示信息等)。主工作区域:显示应用程序核心功能的区域。普通窗体的特点是它通常占据大部分屏幕,并且是用户操作的核心界面,具有完整的窗口控制功能,如最大化、最小化、关闭按钮等。工具窗体(Tool Window)

2025-03-15 16:27:20 751

原创 在 Qt 中自定义控件样式:使用 QProxyStyle 代理和修改绘制元素

Qt 是一个非常强大的跨平台应用程序开发框架,它提供了丰富的功能来定制和修改应用程序的界面样式。在 Qt 中,控件的绘制样式主要由QStyle类控制,而则允许开发者在不修改原始样式的基础上,自定义控件的绘制行为。通过继承并重载相应的绘制方法,开发者可以改变控件的外观或行为,满足特定的设计需求。在本文中,我们将详细讨论如何使用类来自定义控件的样式,重点介绍如何重载方法来改变绘制行为,并介绍如何根据不同的来定制控件的显示效果。如果我们不想完全去除焦点矩形,而是想自定义它的外观(比如改变颜色、形状等),可以在。

2025-03-13 18:32:19 1026

原创 用 Qt 动画制作炫酷的界面效果:属性动画教程

动画能让你的应用更加吸引人,提供更好的用户体验。增强用户体验:动画能够使界面更加生动,提升整体的互动性,避免界面显得死板或者突兀。吸引用户注意力:通过动画,你可以将用户的注意力引导到某些重要的界面元素上,例如按钮、提示信息等。改善界面美感:动画能够使得控件变化过程更加自然,比如按钮的点击效果,控件的显示隐藏,背景的渐变等。Qt 提供了强大的动画框架,允许开发者对控件的属性进行平滑过渡。通过使用动画,用户会感受到应用更具现代感和交互感。

2025-03-13 17:36:30 1652

原创 从零开始:用Qt开发一个功能强大的文本编辑器——WPS项目全解析

在这个项目中,WPS文本编辑器实现了一些常见且实用的文本编辑功能,旨在提供一个简单高效的写作和编辑体验。这个项目实现了一个简单的文本编辑器,功能包括文本的基本编辑、格式化、撤销重做、剪切复制粘贴、以及文本的对齐和字体设置等。通过 Qt 提供的控件和方法,我们可以轻松地实现这些功能。下面是对整个代码实现的详细总结,帮助你更好地理解每一部分功能和实现原理。

2025-02-02 21:30:09 1572

原创 深入理解 Qt 中的信号与槽机制:`private` 和 `private slots` 的区别及新旧版本的连接方式

和的区别中的槽函数不被 Qt 自动识别为槽,因此无法连接信号;而中的槽函数会被 Qt 识别为槽函数,信号能够正确连接。旧版和新版连接方式的区别:旧版连接方式使用字符串,不进行编译时检查,可能导致信号与槽无法正确连接;新版连接方式使用函数指针,支持编译时检查,确保信号与槽的匹配。推荐做法:使用新版连接方式,并将槽函数放在中,这样可以确保信号与槽能够正确连接,同时享受编译时检查的优势。通过这篇博客,相信你能更加清楚地理解 Qt 中信号与槽的连接方式,并避免常见的错误。

2025-01-06 11:32:47 1156

原创 全面解读 Qt 容器类

这些容器类不仅功能强大,还特别针对 Qt 的需求进行了优化,在性能、使用便捷性和内存管理上具有独特优势。在开发中,我们经常需要处理大量数据,比如存储动态变化的任务列表、管理实时更新的设备状态、快速查找某些信息等。开始,深入讲解 Qt 容器类的特点、性能、适用场景和代码示例,帮助大家在开发中更高效地选择合适的容器。Qt 容器类能动态扩展,提供简单的插入、删除、查找、排序等操作,同时对复杂数据类型的内存管理更加友好。Qt 提供了多种容器类,不同的容器在存储方式、性能和使用场景上各不相同。就是容器的典型例子。

2024-11-22 21:33:14 992

原创 Qt 的信号与槽、元对象系统、动态属性与动态类型

在 C++ 中,类的成员变量和方法在编译时是固定的,运行时无法动态操作。动态调用方法。查询类的属性和方法。实现信号与槽的动态连接。动态属性是 Qt 提供的一种运行时扩展功能,允许你为一个QObject动态添加属性,而不需要修改类的定义。Qt 的信号与槽机制元对象系统动态属性和动态类型是其核心技术,提供了运行时的灵活性和动态能力,让程序设计更加高效和简洁。

2024-11-17 22:36:10 1013

原创 Qt实现简易CAD软件的开发:技术解析与实现

该简易CAD软件项目使用了Qt框架,这是一个跨平台的C++图形用户界面库。main.cpp:程序入口。和:主窗口的实现和定义。:UI布局文件。和:自定义绘图视图的实现和定义。res.qrc:资源文件。Q_OBJECTpublic:private:自定义绘图视图类继承自,负责处理用户的绘图操作,如鼠标点击、移动和释放等事件。以下是该类的定义和实现。

2024-07-22 16:52:56 3271 12

原创 Qt坐标变换详解

Qt提供了丰富的坐标变换功能,包括平移、旋转、剪切和缩放等,使得图形编程更加灵活和强大。通过save()和restore()方法,可以方便地管理和切换不同的变换状态。掌握这些坐标变换方法,将极大地提升我们在Qt中进行图形绘制的能力。

2024-07-07 23:14:48 1201

原创 Qt 绘图详解

通过以上这些代码示例和详细解释,相信你已经掌握了在Qt中进行各种图形绘制的方法。Qt的绘图功能非常强大,能够满足各种复杂的绘图需求。首先,我们在每个图形的绘制过程中启用反锯齿功能,以保证绘制效果的平滑。多点连接的线的顶点。

2024-07-06 23:23:41 891

原创 使用 Qt 实现自定义拖动窗口

让我们从创建一个基本的 Qt 应用程序开始,并定义一个类。下面是一个基于QWidgetQ_OBJECTpublic:// 设置无标题栏窗口// 设置窗口大小protected:if (event->button() == Qt::LeftButton) { // 检查是否按下了鼠标左键// 设置拖动状态为真,表示开始拖动// 记录鼠标按下时的全局位置与窗口左上角位置的差值// 接受事件,防止事件进一步传播// 调用基类的 mousePressEvent 以确保默认行为被执行。

2024-07-05 22:51:41 1429

原创 使用Qt实现文本文件的读写操作

在现代应用程序开发中,文件操作是一个不可或缺的任务。无论是读取配置文件、处理用户输入,还是保存日志信息,文件的读取和写入操作都非常重要。Qt框架作为一个强大且灵活的跨平台C++框架,为文件操作提供了丰富的类和方法。在本文中,我们将探讨如何使用Qt进行文本文件的读取和写入操作,特别是使用QFileDialog类来打开和保存文件。我们将展示如何通过一个简单的图形用户界面(GUI),利用QFile、QTextStream和QFileDialog类来高效地进行文件操作。

2024-06-04 21:41:33 2996

原创 VS2022连接数据库以及常用的连接函数

【代码】VS2022连接数据库以及常用的连接函数。

2024-03-05 09:00:35 992 2

原创 VS2022连接MYSQL数据库乱码解决方案以及注意事项

### 为什么能够使用不同的编码?1. **自动编码转换**:MySQL 服务器会根据客户端设置的字符集自动转换数据。当数据从数据库发送到客户端时(查询操作),如果客户端使用的字符集(如 GBK)与存储数据的字符集(如 UTF-8)不同,MySQL 会将数据从存储的字符集转换为客户端设置的字符集。同样,当数据从客户端发送到服务器时(如插入或更新操作),MySQL 也会进行适当的转换。2. **设置客户端字符集**:在连接数据库时,客户端(VS 或其他应用程序)可以指定要使用的字符集。如果你在连接字符串

2024-03-05 08:53:43 1062

原创 红黑树的原理

定义 — 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:1)节点是红色或黑色;2)根节点是黑色;3)所有叶子节点都是黑色节点(NULL);4)每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。5)从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

2023-09-17 22:02:38 700

原创 哈夫曼编码原理及实现

构建编码树的方法是将频率最低的两个符号合并为一个新节点,该节点的频率为两个节点频率之和。哈夫曼编码(Huffman Coding)是一种用于数据压缩的编码方法,它通过给出不同的数据符号分配不同长度的编码,使得出现频率高的符号具有较短的编码,而出现频率低的符号具有较长的编码,从而达到压缩数据的目的。然而,对于哈夫曼编码的最佳性能,符号的频率应该是根据数据集的统计特征进行调整的。由于频率高的符号具有较短的编码,而频率低的符号具有较长的编码,所以整个编码后的数据长度会相对减小。

2023-09-17 21:52:20 4506

原创 二叉树的具体原理及实现

如果要插入的键值小于当前节点的键值,并且当前节点没有左子节点,则将新节点作为当前节点的左子节点;如果要插入的键值大于当前节点的键值,并且当前节点没有右子节点,则将新节点作为当前节点的右子节点。首先,找到要删除的节点。如果要删除的节点有两个子节点,可以找到其右子树中的最小节点(或者左子树中的最大节点)来替换它。将要删除的节点的值,与节点 root 节点进行比较,若小于则去到左子树进行比较,若大于则去到右子树进行比较,重复以。4.删除节点存在左右子节点,则取左子树上的最大节点或右子树上的最小节点替换删除节点。

2023-09-17 21:39:20 1009

原创 C++友元函数和友元类

在C++中,友元(friend)是一种机制,允许某个类或函数访问其他类的私有成员。通过友元,可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用,例如在类之间共享数据或实现特定的功能。友元可以分为两种类型:类友元和函数友元。友元的使用场景包括但不限于以下情况:当两个或多个类需要共享私有数据时,可以使用类友元来实现数据的直接访问,而无需通过公有接口。当某个类需要提供特定函数或操作给其他类使用,但这些函数需要访问类的私有成员时,可以使用函数友元。

2023-08-18 13:53:07 163

原创 函数指针与指针函数

函数指针与指针函数详解

2023-07-04 17:53:40 512

原创 顺序表的实现

结构体定义 # define MAX_SIZE 100 struct _SqList {// 顺序表的基地址 int length;// 顺序表的长度 int size;// 顺序表总的空间大小 }100结构体定义 # define MAX_SIZE 100 struct _SqList {// 顺序表的基地址 int length;// 顺序表的长度 int size;// 顺序表总的空间大小 }

2023-01-01 11:14:33 353 1

原创 C++,STL,set,multiset容器

set和multiset是一个集合容器,其中set所包含的元素是唯一的,集合中的元素按一定的顺序排列。set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。在n个数中查找目标数的效率是 log2 n红黑树定义 — 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:1)节点是红色或黑色;2)根节点是黑色;3)所有叶子节点都是黑色节点(NULL);4)每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续

2022-12-05 21:45:02 437

原创 C++,STL,List容器

/反转链表,比如list包含1, 2, 3, 4, 5五个元素,运行此方法后,list就包含5, 4, 3, 2, 1元素。//在pos位置插入[beg,end)区间的数据,无返回值。//在pos位置插入一个elem元素的拷贝,返回新数据的位置。//将[beg, end)区间中的数据拷贝赋值给本身。//删除[beg,end)区间的数据,返回下一个数据的位置。//将[beg, end)区间中的元素拷贝给本身。//删除pos位置的数据,返回下一个数据的位置。

2022-11-22 22:08:57 282

原创 C++,STL,deque容器

deque是“double-ended queue”的缩写,和vector一样都是STL的容器,唯一不同的 是: deque是双端数组,而vector是单端的。//将[beg, end)区间中的数据拷贝赋值给本身。//在pos位置插入一个elem元素的拷贝,返回新数据 的位置。//在pos位置插入[beg,end)区间的数据,无返回值。//构造函数将[beg, end)区间中的元素拷贝给本身。//删除[beg,end)区间的数据,返回下一个数据的位置。//存放float的deque容器。

2022-11-19 11:13:14 155

原创 C++,STL,vector容器

vector相当于顺序表vector是将元素置于一个动态数组中加以管理的容器。vector可以随机存取元素,支持索引值直接存取, 用[]操作符或at()方法对元素进行操作vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时,这是因为在中部或者头部插入数据,所以数据都会移动,会大量拷贝。

2022-11-18 09:46:22 908

原创 利用指针找最大值

实现的方法很简单,一边输入一边判断,遍历数组在使用一个值专门来记数组最大值的下标就可以了,

2022-11-04 23:06:40 7026

空空如也

空空如也

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

TA关注的人

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