- 博客(59)
- 收藏
- 关注
原创 C++ Map 查询时的两个小细节:`map[id]` 与 `map.value(id, nullptr)` 的区别
map[id]适用于你希望在查询时自动插入新元素的场景,尤其当你确定插入默认值是合理的情况下使用。需要小心它的自动插入行为,可能会导致不必要的元素插入。适用于你只想查询是否存在某个键,并且不希望修改map的场景。它能提供更加明确的行为,并避免不小心插入新元素。如果id不存在,返回默认值,而不会改变map的内容。
2025-03-16 17:32:08
575
原创 设计模式详解:提高代码复用性与可维护性的关键
抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定具体类。它适用于需要创建一组相关对象的场景,客户端通过工厂来获取一系列产品,而无需关心具体的产品类。设计模式是软件开发中经过多年实践验证的解决方案,它帮助我们解决常见的设计问题,提升代码的可维护性、可扩展性和可复用性。通过设计模式,我们可以减少开发中的重复工作和错误,同时提升系统的灵活性。创建型模式:关注如何创建对象,提供灵活的实例化方法。结构型模式:关注如何组织类和对象之间的关系,使得系统的结构更加清晰和高效。行为型模式。
2025-03-16 17:15:50
920
原创 单例模式(Singleton Pattern)详解:确保类的唯一性
单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来访问该实例。确保类只有一个实例。提供一个全局访问点,允许任何地方访问该唯一实例。
2025-03-16 17:08:38
900
原创 深入理解 Qt 系统托盘图标:创建自定义的系统托盘图标类
在现代桌面应用程序中,系统托盘图标(通常位于任务栏右下角)是一个常见的交互方式。它为用户提供了快捷的操作界面,如显示应用程序、退出程序、查看通知等。在 Qt 中,类允许我们轻松地在系统托盘中添加图标并与用户交互。今天,我们将介绍如何创建一个自定义的系统托盘图标类,使其能够响应用户的点击事件,并显示一个右键菜单。我们创建了一个名为的类,继承自,并实现了一些附加功能,如响应用户的点击事件、弹出右键菜单等。在这篇博客中,我们创建了一个名为的自定义系统托盘图标类,它继承自设置托盘图标。
2025-03-15 17:09:17
860
原创 Qt 中工具窗体与普通窗体在任务栏中的区别
普通窗体(Main Window)普通窗体是应用程序的主要窗口,通常是用户与应用程序交互的主要界面。Qt 提供了类,用于创建和管理应用程序的主界面。菜单栏:通常包含应用的文件、编辑、视图等菜单项。工具栏:包含常用的工具按钮。状态栏:用于显示应用的状态信息(如进度条、提示信息等)。主工作区域:显示应用程序核心功能的区域。普通窗体的特点是它通常占据大部分屏幕,并且是用户操作的核心界面,具有完整的窗口控制功能,如最大化、最小化、关闭按钮等。工具窗体(Tool Window)
2025-03-15 16:27:20
714
原创 在 Qt 中自定义控件样式:使用 QProxyStyle 代理和修改绘制元素
Qt 是一个非常强大的跨平台应用程序开发框架,它提供了丰富的功能来定制和修改应用程序的界面样式。在 Qt 中,控件的绘制样式主要由QStyle类控制,而则允许开发者在不修改原始样式的基础上,自定义控件的绘制行为。通过继承并重载相应的绘制方法,开发者可以改变控件的外观或行为,满足特定的设计需求。在本文中,我们将详细讨论如何使用类来自定义控件的样式,重点介绍如何重载方法来改变绘制行为,并介绍如何根据不同的来定制控件的显示效果。如果我们不想完全去除焦点矩形,而是想自定义它的外观(比如改变颜色、形状等),可以在。
2025-03-13 18:32:19
928
原创 用 Qt 动画制作炫酷的界面效果:属性动画教程
动画能让你的应用更加吸引人,提供更好的用户体验。增强用户体验:动画能够使界面更加生动,提升整体的互动性,避免界面显得死板或者突兀。吸引用户注意力:通过动画,你可以将用户的注意力引导到某些重要的界面元素上,例如按钮、提示信息等。改善界面美感:动画能够使得控件变化过程更加自然,比如按钮的点击效果,控件的显示隐藏,背景的渐变等。Qt 提供了强大的动画框架,允许开发者对控件的属性进行平滑过渡。通过使用动画,用户会感受到应用更具现代感和交互感。
2025-03-13 17:36:30
1466
原创 从零开始:用Qt开发一个功能强大的文本编辑器——WPS项目全解析
在这个项目中,WPS文本编辑器实现了一些常见且实用的文本编辑功能,旨在提供一个简单高效的写作和编辑体验。这个项目实现了一个简单的文本编辑器,功能包括文本的基本编辑、格式化、撤销重做、剪切复制粘贴、以及文本的对齐和字体设置等。通过 Qt 提供的控件和方法,我们可以轻松地实现这些功能。下面是对整个代码实现的详细总结,帮助你更好地理解每一部分功能和实现原理。
2025-02-02 21:30:09
1420
原创 深入理解 Qt 中的信号与槽机制:`private` 和 `private slots` 的区别及新旧版本的连接方式
和的区别中的槽函数不被 Qt 自动识别为槽,因此无法连接信号;而中的槽函数会被 Qt 识别为槽函数,信号能够正确连接。旧版和新版连接方式的区别:旧版连接方式使用字符串,不进行编译时检查,可能导致信号与槽无法正确连接;新版连接方式使用函数指针,支持编译时检查,确保信号与槽的匹配。推荐做法:使用新版连接方式,并将槽函数放在中,这样可以确保信号与槽能够正确连接,同时享受编译时检查的优势。通过这篇博客,相信你能更加清楚地理解 Qt 中信号与槽的连接方式,并避免常见的错误。
2025-01-06 11:32:47
956
原创 全面解读 Qt 容器类
这些容器类不仅功能强大,还特别针对 Qt 的需求进行了优化,在性能、使用便捷性和内存管理上具有独特优势。在开发中,我们经常需要处理大量数据,比如存储动态变化的任务列表、管理实时更新的设备状态、快速查找某些信息等。开始,深入讲解 Qt 容器类的特点、性能、适用场景和代码示例,帮助大家在开发中更高效地选择合适的容器。Qt 容器类能动态扩展,提供简单的插入、删除、查找、排序等操作,同时对复杂数据类型的内存管理更加友好。Qt 提供了多种容器类,不同的容器在存储方式、性能和使用场景上各不相同。就是容器的典型例子。
2024-11-22 21:33:14
955
原创 Qt 的信号与槽、元对象系统、动态属性与动态类型
在 C++ 中,类的成员变量和方法在编译时是固定的,运行时无法动态操作。动态调用方法。查询类的属性和方法。实现信号与槽的动态连接。动态属性是 Qt 提供的一种运行时扩展功能,允许你为一个QObject动态添加属性,而不需要修改类的定义。Qt 的信号与槽机制元对象系统动态属性和动态类型是其核心技术,提供了运行时的灵活性和动态能力,让程序设计更加高效和简洁。
2024-11-17 22:36:10
971
原创 Qt实现简易CAD软件的开发:技术解析与实现
该简易CAD软件项目使用了Qt框架,这是一个跨平台的C++图形用户界面库。main.cpp:程序入口。和:主窗口的实现和定义。:UI布局文件。和:自定义绘图视图的实现和定义。res.qrc:资源文件。Q_OBJECTpublic:private:自定义绘图视图类继承自,负责处理用户的绘图操作,如鼠标点击、移动和释放等事件。以下是该类的定义和实现。
2024-07-22 16:52:56
3036
7
原创 Qt坐标变换详解
Qt提供了丰富的坐标变换功能,包括平移、旋转、剪切和缩放等,使得图形编程更加灵活和强大。通过save()和restore()方法,可以方便地管理和切换不同的变换状态。掌握这些坐标变换方法,将极大地提升我们在Qt中进行图形绘制的能力。
2024-07-07 23:14:48
1112
原创 Qt 绘图详解
通过以上这些代码示例和详细解释,相信你已经掌握了在Qt中进行各种图形绘制的方法。Qt的绘图功能非常强大,能够满足各种复杂的绘图需求。首先,我们在每个图形的绘制过程中启用反锯齿功能,以保证绘制效果的平滑。多点连接的线的顶点。
2024-07-06 23:23:41
833
原创 使用 Qt 实现自定义拖动窗口
让我们从创建一个基本的 Qt 应用程序开始,并定义一个类。下面是一个基于QWidgetQ_OBJECTpublic:// 设置无标题栏窗口// 设置窗口大小protected:if (event->button() == Qt::LeftButton) { // 检查是否按下了鼠标左键// 设置拖动状态为真,表示开始拖动// 记录鼠标按下时的全局位置与窗口左上角位置的差值// 接受事件,防止事件进一步传播// 调用基类的 mousePressEvent 以确保默认行为被执行。
2024-07-05 22:51:41
1253
原创 使用Qt实现文本文件的读写操作
在现代应用程序开发中,文件操作是一个不可或缺的任务。无论是读取配置文件、处理用户输入,还是保存日志信息,文件的读取和写入操作都非常重要。Qt框架作为一个强大且灵活的跨平台C++框架,为文件操作提供了丰富的类和方法。在本文中,我们将探讨如何使用Qt进行文本文件的读取和写入操作,特别是使用QFileDialog类来打开和保存文件。我们将展示如何通过一个简单的图形用户界面(GUI),利用QFile、QTextStream和QFileDialog类来高效地进行文件操作。
2024-06-04 21:41:33
2685
原创 VS2022连接MYSQL数据库乱码解决方案以及注意事项
### 为什么能够使用不同的编码?1. **自动编码转换**:MySQL 服务器会根据客户端设置的字符集自动转换数据。当数据从数据库发送到客户端时(查询操作),如果客户端使用的字符集(如 GBK)与存储数据的字符集(如 UTF-8)不同,MySQL 会将数据从存储的字符集转换为客户端设置的字符集。同样,当数据从客户端发送到服务器时(如插入或更新操作),MySQL 也会进行适当的转换。2. **设置客户端字符集**:在连接数据库时,客户端(VS 或其他应用程序)可以指定要使用的字符集。如果你在连接字符串
2024-03-05 08:53:43
938
原创 红黑树的原理
定义 — 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:1)节点是红色或黑色;2)根节点是黑色;3)所有叶子节点都是黑色节点(NULL);4)每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。5)从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
2023-09-17 22:02:38
678
原创 哈夫曼编码原理及实现
构建编码树的方法是将频率最低的两个符号合并为一个新节点,该节点的频率为两个节点频率之和。哈夫曼编码(Huffman Coding)是一种用于数据压缩的编码方法,它通过给出不同的数据符号分配不同长度的编码,使得出现频率高的符号具有较短的编码,而出现频率低的符号具有较长的编码,从而达到压缩数据的目的。然而,对于哈夫曼编码的最佳性能,符号的频率应该是根据数据集的统计特征进行调整的。由于频率高的符号具有较短的编码,而频率低的符号具有较长的编码,所以整个编码后的数据长度会相对减小。
2023-09-17 21:52:20
4259
原创 二叉树的具体原理及实现
如果要插入的键值小于当前节点的键值,并且当前节点没有左子节点,则将新节点作为当前节点的左子节点;如果要插入的键值大于当前节点的键值,并且当前节点没有右子节点,则将新节点作为当前节点的右子节点。首先,找到要删除的节点。如果要删除的节点有两个子节点,可以找到其右子树中的最小节点(或者左子树中的最大节点)来替换它。将要删除的节点的值,与节点 root 节点进行比较,若小于则去到左子树进行比较,若大于则去到右子树进行比较,重复以。4.删除节点存在左右子节点,则取左子树上的最大节点或右子树上的最小节点替换删除节点。
2023-09-17 21:39:20
966
原创 C++友元函数和友元类
在C++中,友元(friend)是一种机制,允许某个类或函数访问其他类的私有成员。通过友元,可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用,例如在类之间共享数据或实现特定的功能。友元可以分为两种类型:类友元和函数友元。友元的使用场景包括但不限于以下情况:当两个或多个类需要共享私有数据时,可以使用类友元来实现数据的直接访问,而无需通过公有接口。当某个类需要提供特定函数或操作给其他类使用,但这些函数需要访问类的私有成员时,可以使用函数友元。
2023-08-18 13:53:07
142
原创 顺序表的实现
结构体定义 # 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
330
1
原创 C++,STL,set,multiset容器
set和multiset是一个集合容器,其中set所包含的元素是唯一的,集合中的元素按一定的顺序排列。set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。在n个数中查找目标数的效率是 log2 n红黑树定义 — 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:1)节点是红色或黑色;2)根节点是黑色;3)所有叶子节点都是黑色节点(NULL);4)每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续
2022-12-05 21:45:02
414
原创 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
262
原创 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
127
原创 C++,STL,vector容器
vector相当于顺序表vector是将元素置于一个动态数组中加以管理的容器。vector可以随机存取元素,支持索引值直接存取, 用[]操作符或at()方法对元素进行操作vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时,这是因为在中部或者头部插入数据,所以数据都会移动,会大量拷贝。
2022-11-18 09:46:22
898
原创 顺序栈的各种操作
注意:顺序栈只能在一端操作,后进先出,这是栈的关键特征,也就是说不允许在中间查找,取值,插入,删除,等,操作,掌握好顺序栈的,初始化,入栈,出栈,去栈顶元素等操作即可。2.进出的一端为栈顶(top),另一端为栈底(base),栈可以用顺序存储,也可以用链式存储。1.栈是一种线性表,只不过它是操作,受限的线性表,只能在一端操作。其中,base指向栈地,top指向栈顶。
2022-10-04 19:28:35
356
原创 Linux 内核“共享”双向链表(高逼格代码)
/一. web 服务器超时的链表结构 typedef struct {int fd;// 使用超时时刻的时间戳表示 } ConnTimeout;} //二.璀璨星空的链表结构 typedef struct {int x;//星星的 x 坐标 int y;//星星的 y 坐标 enum STATUS stat;//状态 unsigned radius;//星星的半径 int step;//每次跳跃的间隔 int color;//星星的颜色 } STAR;}...
2022-08-08 18:42:30
211
原创 C++类型转换
旧式转型 C风格的强制类型:TYPE b = (TYPE) a例如:int i = 48;char c = (char) i;新式转型C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。格式:TYPE b = 类型操作符 ( a )类型操作符= static_cast | reinterpreter_cast | dynamic_cast | const_cast静态类型转换(斯文的劝导,温柔的转换)。如int转换成char主要用法:1.用于类层次结构中基类(父类)和派生类
2022-07-13 22:57:41
350
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人