- 博客(69)
- 收藏
- 关注
原创 Qt(制作一个简单的文本编辑器)
本文详细介绍了使用Qt框架开发一个简易文本编辑器的完整过程。主要内容包括:1)界面元素创建:通过QMainWindow构建主窗口,添加菜单栏、工具栏和中央文本编辑区;2)功能实现:利用QFileDialog实现文件打开/保存功能,QFontDialog和QColorDialog提供字体和颜色设置;3)信号槽机制:连接各控件动作与对应功能函数;4)代码结构:采用成员变量封装UI组件,通过独立函数组织菜单栏创建逻辑。最终实现了一个具有基本文本编辑功能、支持文件操作和格式设置的GUI应用程序,展示了Qt在界面开发
2025-09-26 20:04:37
1069
原创 Qt(菜单栏、工具栏、状态栏)
摘要:本文介绍了Qt中三种常见界面组件(菜单栏、工具栏、状态栏)的创建和使用方法。菜单栏通过menuBar()或new创建,可添加带图标的菜单项;工具栏支持多实例和拖动停靠,可添加QAction操作项;状态栏用于显示临时/永久消息和进度条,通过showMessage()、addPermanentWidget()等方法实现不同信息展示。三者均支持代码创建或UI设计器可视化设计,其中状态栏最多只能有一个实例。
2025-09-26 00:08:01
1061
原创 Qt(对象树机制)
Qt通过对象树机制自动管理对象生命周期,形成父子层次结构。QObject维护父指针和子节点双向链表(含哨兵节点),实现高效增删。对象构造时加入父对象children列表,析构时后序遍历销毁子对象,避免内存泄漏。每个对象用objectName作为唯一标识,确保子对象先于父对象释放。该机制基于QObject核心特性,通过递归销毁实现内存安全管理。
2025-09-25 16:11:59
288
原创 Qt(常用对话框示例)
该文章展示了Qt中主界面与子界面的双向切换实现方案。通过信号槽机制,子界面(ChildDialog)可向主界面(MainDialog)发送切换信号。子界面集成了多种常用对话框:1) 询问/警告对话框(QMessageBox);2) 文件对话框(QFileDialog)支持打开/保存文件和选择目录;3) 颜色选择对话框(QColorDialog);4) 输入对话框(QInputDialog)支持文本、数字和选项输入。主界面通过exec()方式保持模态特性,确保程序只能通过主界面退出。子界面切换需经过两次确认对
2025-09-23 16:21:52
914
原创 Qt(常用的对话框)
本文介绍了Qt中常用的几种对话框组件及其使用方法: 消息对话框(QMessageBox):包括信息提示(information)、警告(warning)、错误(critical)和询问(question)对话框,支持自定义按钮和默认选项。 文件对话框(QFileDialog):提供文件选择(getOpenFileName)、多文件选择(getOpenFileNames)、保存文件(getSaveFileName)和目录选择(getExistingDirectory)功能。 颜色和字体对话框:getColor
2025-09-23 15:07:17
734
原创 Qt(模态对话框的切换)
本文介绍了Qt中模态对话框的实现方式,重点分析了exec()函数的工作原理。通过一个主界面和子界面的示例代码,展示了如何通过exec()函数实现模态对话框的显示和状态返回。当调用exec()时,会启动局部事件循环阻塞其他窗口交互,直到对话框关闭。函数返回值为Accepted或Rejected,分别对应不同的处理逻辑。示例中主界面通过判断子界面返回值决定是否重新显示主界面或退出程序。文章还详细解析了exec()内部实现机制,包括自动显示、事件循环创建和状态返回等关键步骤。
2025-09-21 20:33:33
703
原创 Qt(信号和槽函数)
Qt信号与槽机制实现了对象间安全灵活的通信。信号是特殊成员函数,通过emit触发;槽函数响应信号,分为public/protected/private三种访问权限。示例展示了按钮点击切换界面:主窗口按钮点击隐藏主窗口并显示子窗口;子窗口按钮点击发送信号,主窗口接收后隐藏子窗口并重新显示主窗口。通过connect()建立连接,信号参数需与槽匹配,系统自动处理线程安全和对象析构。这种机制取代回调函数,提供更优雅的对象通信方式。
2025-09-21 16:14:25
966
原创 Qt(模态对话框和非模态对话框)
Qt对话框分为模态和非模态两种类型:模态对话框通过exec()显示,会阻塞父窗口或整个应用的事件循环,必须关闭后才能继续交互,适用于必须立即响应的场景;非模态对话框通过show()显示,不阻塞其他窗口交互,通常需在堆上分配内存并管理生命周期,适合工具面板等辅助功能。两者主要区别在于阻塞性、实现方式和适用场景,开发时需根据具体需求选择适当类型。
2025-09-21 13:48:32
1202
原创 C++(左值与右值)
如果返回的是局部变量的任何引用,那么会导致悬垂引用,悬垂引用是指,引用绑定的对象已经超过其生命周期的情况。特性左值(lvalue)右值(rvalue)左值引用(T&)右值引用(T&&)万能引用(T&&)定义持久身份的对象临时值左值的别名右值的引用可绑定左/右值的引用内存地址有无共享左值地址共享右值地址取决于绑定对象生命周期作用域决定表达式结束同绑定对象可延长右值生命周期同绑定对象赋值左侧可以不可以可以不可以取决于绑定对象取地址。
2025-09-20 15:56:51
612
原创 C++(使用AVL实现map)
AVL树是一种自平衡二叉搜索树,通过四种旋转操作(右旋、左旋、左右双旋、右左双旋)维护树的平衡性,确保左右子树高度差不超过1。本文实现了一个AVL树模板类Map,支持插入、查找、删除等操作,并通过中序遍历验证功能。测试代码展示了插入键值对、查找元素和删除节点的操作过程,最后输出中序遍历结果验证了AVL树的正确性。关键点包括:1)平衡因子计算;2)四种旋转操作的实现;3)插入和删除时的自平衡调整。
2025-09-19 13:47:14
331
原创 C++(双端队列)
Deque是C++中STL提供的一种序列容器。允许在队头和队尾进行插入和删除操作,可以进行随机访问。双端队列是一个关联性数据结构,通过中控器也就是一个动态数组用于存储指向缓冲区的指针,缓冲区是存储元素的连续内存块,大小固定,默认为521字节。当中控器空间不足时,会分配更大的数组,并复制原有指针,中控器存储的数组分别指向不同的缓冲区,维护逻辑上的连续性。push_front():在队头进行插入元素。push_back():在队尾进行插入元素。front():访问队列的队头元素。
2025-09-17 01:41:33
349
原创 C++(list)
摘要:C++ STL中的list是双向链表容器,提供O(1)时间复杂度的插入删除操作,但不支持随机访问(需O(n)遍历)。主要操作包括:front()/back()访问首尾元素,push/pop_front/back()头尾操作,insert()/erase()指定位置操作。通过示例代码演示了正向/反向插入的区别,以及迭代器在插入删除时的特性。最后给出了一个简化版的list实现,包含节点结构、基本操作和内存管理。list适合频繁插入删除但较少随机访问的场景。
2025-09-16 18:46:44
1010
原创 C++(智能指针)
摘要: C++智能指针(unique_ptr/shared_ptr/weak_ptr)自动管理动态内存,防止内存泄漏和悬空指针。unique_ptr独占所有权,禁止拷贝但支持移动;shared_ptr允许多指针共享对象,通过引用计数自动释放;weak_ptr作为shared_ptr的弱引用,解决循环引用问题。三者各有特点:unique_ptr零开销,shared_ptr需额外控制块,weak_ptr不影响引用计数。
2025-09-15 19:23:56
975
原创 C++(new和malloc)
本文介绍了C++中内存管理的核心概念和操作。主要内容包括:1)C++内存区域划分(栈、堆、静态存储区、常量区);2)malloc/realloc的使用方法及注意事项,需手动初始化和释放;3)new操作符的优势,能自动调用构造函数/析构函数;4)通过placement new在malloc分配的内存上构造对象的方法。文章通过多个代码示例展示了不同内存分配方式的行为差异,强调了正确管理内存的重要性,包括避免内存泄漏、双重释放等问题。
2025-09-14 21:48:18
771
原创 C++(虚函数表原理和菱形继承)
摘要:本文深入解析了C++虚函数表机制及其内存布局。虚函数表是实现多态的核心,每个包含虚函数的类都有对应的虚函数表,实例对象通过虚函数指针访问。文章通过代码示例演示了类内存布局的计算方法,包括内存对齐原则,并详细分析了单继承和多继承情况下的虚函数表结构。特别探讨了菱形继承问题及其解决方案——虚继承机制,指出虚继承会引入虚基类指针,影响内存布局和访问效率。最后强调了应避免过度使用虚继承以保持程序性能。
2025-09-14 15:17:24
939
原创 C++(静态函数)
从报错信息可以知道静态函数,不能够声明为虚函数,因为虚函数依赖对象的虚函数表指针,而静态函数并不属于对象。成员函数可以在类内进行声明内部直接实现,也可以类内声明后在类外定义。静态函数只能访问类的静态成员表变量或者静态函数,无法直接访问非静态成员,因为静态函数没有this指针。可以通过类名或者对象来调用静态函数。静态成员函数本质是代码段,编译时已确定地址,而静态成员变量需要分配独立内存空间,必须在类外显示定义分配存储区。C++中的静态函数通过static关键字进行修饰,静态函数不属于对象,而是属于类。
2025-09-13 19:32:47
498
原创 C++(继承和多态)
本文介绍了C++中继承和多态的核心概念。继承包括public、protected和private三种方式,分别影响基类成员在派生类中的访问权限。构造顺序为先基类后派生类,析构顺序相反。多态通过虚函数实现运行时动态绑定,使用override关键字显式重写,final防止继续重写。虚析构函数确保派生类对象正确释放。纯虚函数通过"=0"声明,使类成为抽象类,不可实例化。这些特性共同构成了C++面向对象编程的基础,支持代码重用和灵活扩展。
2025-09-13 18:53:51
737
原创 C++(友元和运算符重载)
摘要:本文介绍了C++中友元(friend)机制的使用,包括友元函数和友元类。友元允许外部函数或类访问类的私有和保护成员,通过friend关键字声明。文章通过示例展示了友元函数访问私有成员_name的实现,并详细说明了友元类的特点:不具有传递性和继承性。同时讨论了运算符重载的实现方法,包括+、<<、=、++等运算符的重载示例。最后,文章总结了友元机制的优缺点:虽然能解决特殊访问需求,但会破坏封装性,增加代码耦合度,建议谨慎使用,优先考虑成员函数和公有接口。
2025-09-12 18:34:18
515
原创 C++(深拷贝和浅拷贝)
C++中类的默认拷贝构造函数执行浅拷贝,可能导致双重释放或悬空指针问题。浅拷贝仅复制指针地址,新旧对象共享同一内存;深拷贝则复制指针指向的数据并分配新内存,确保对象独立。悬空指针常见于释放后未置空、返回局部变量地址或对象生命周期结束等情况。通过自定义拷贝构造函数实现深拷贝(如为新对象分配独立内存),可避免内存管理问题。实际开发中应根据对象是否包含动态资源选择浅拷贝或深拷贝,权衡性能与安全性。
2025-09-11 19:27:42
518
原创 C++(类的基本概念)
本文介绍了面向对象编程中类的核心概念。类是实现信息封装的基础,包含数据成员和成员函数,具有封装、继承和多态三大特性。重点讲解了访问权限控制(public/private/protected)、构造函数(默认构造、有参构造、拷贝构造)和析构函数的作用,以及初始化列表的使用场景(const成员、引用成员等)。特别强调了移动构造函数的优势,它通过转移资源所有权而非深拷贝来提高效率。通过Student类的代码示例,展示了各种构造函数的实现方式及其调用时机,说明了移动构造后原对象处于有效但未定义状态的特点。
2025-09-11 17:52:33
1060
原创 C++(vector):
C++中的vector是STL提供的动态数组,支持自动扩容。使用时需包含<vector>头文件。主要操作包括:1)初始化方式(默认构造、拷贝构造、移动构造等);2)遍历输出(索引、迭代器、at()函数);3)容量管理(size()获取元素数、capacity()获取容量、shrink_to_fit()释放空间);4)增删元素(push_back/pop_back、insert/erase);5)排序查找(sort/reverse、find算法)。
2025-08-24 21:27:41
867
原创 C++(String):
C++中的string类提供了比C风格字符串更安全便捷的字符串操作。摘要如下:1) string自动管理内存,支持多种初始化方式;2) 输入方式包括cin(空格分隔)和getline(整行读取);3) 提供字符串拼接(+、+=、append)、查找(find)、替换(replace)和截取(substr)等功能;4) 支持长度/容量查询、删除(erase)、插入(insert)和清空(clear)操作;5) resize调整大小,shrink_to_fit缩减容量;6) 可通过索引、迭代器或at()遍历;7
2025-08-24 19:59:56
938
原创 C++的指针和引用:
C++中的引用和指针是两种重要的内存访问机制。引用是变量的别名,必须在初始化时绑定对象且不可更改,不占用额外内存空间。指针是存储地址的变量,可以重新赋值,支持多级间接访问。关键区别在于:引用必须初始化,指针可为空;引用不占独立内存,指针需要存储空间;指针支持地址运算,引用不支持;sizeof(指针)返回地址大小,引用返回绑定对象大小。右值引用专门处理临时对象,提高资源管理效率。理解这些概念对编写高效C++代码至关重要。
2025-08-22 22:54:59
871
原创 Linux的基本操作指令:
本文总结了Linux常用命令及其参数选项,主要包括文件管理(ls、cd、mkdir等)、内容查看(cat、more、less等)、权限管理(chmod、chown)、用户管理(useradd、usermod等)、进程管理(ps、kill)、网络工具(ping、wget等)以及定时任务(crontab)。详细说明了各命令的功能、参数用途和使用场景,如ls的-a、-l选项,find的-name、-size参数,tar的压缩解压选项等。同时介绍了基本概念如管道符、软链接、权限表示法等。
2025-08-21 15:33:29
954
原创 MySQL的多版本并发控制(MVCC):
MVCC机制通过隐藏字段、回滚日志和ReadView实现高并发访问,支持快照读和当前读两种方式。ReadView根据事务ID判断数据版本可见性,确保事务隔离性。快照读无锁读取历史版本,当前读加锁获取最新数据。该机制降低了死锁风险,解决了读写阻塞问题,提高了并发性能,适用于读已提交和可重复读隔离级别。
2025-08-18 23:35:21
972
原创 MySQL的锁:
在数据库中除了计算资源外,数据也是共享的资源,为了保证数据的一致性,需要对并发操作进行控制。锁是计算机协调多个进程或者线程并发访问某一资源的机制。当多线程并发访问某个数据,需要保证在任何时刻最多只有一个线程在访问,保证数据的完整性和一致性。锁机制为实现MySQL的各个隔离级别提供了保证。锁冲突也是影响数据库并发访问性能的一个重要因素。
2025-08-18 20:08:40
1066
原创 MySQL的事务日志:
目标数据如果不在缓存池中,将磁盘中的数据页写入到内存缓冲池中,将原数据写入到undo日志中便于回滚,进行数据的更新操作,会将对应的数据写入到redo日志缓存当中,当提交事务时,根据设定的刷盘策略来进行刷盘,将内存中的脏页刷到磁盘当中。如果未提交或者事务崩溃,那么则根据undo日志进行一个数据回滚,恢复至原数据,保证数据的可靠性。
2025-08-17 20:32:58
1137
原创 MySQL的事务基础概念:
摘要:事务是数据库的核心特性,具有ACID属性(原子性、一致性、隔离性、持久性)。事务状态包括活动、部分提交、失败、中止和提交状态。使用事务时需要显式开启(BEGIN/START TRANSACTION)和提交(COMMIT)或回滚(ROLLBACK)。MySQL支持四种隔离级别(未提交读、提交读、可重复读、可串行化),可解决脏读、不可重复读和幻读问题,但隔离级别越高性能越低。用户可通过SET TRANSACTION设置隔离级别,影响范围为全局或会话级别。
2025-08-17 15:00:45
885
原创 MySQL的三大范式:
数据库范式是关系型数据库设计的基本原则,包括1NF、2NF、3NF等,级别越高冗余越低。1NF要求字段原子性,2NF消除部分依赖,3NF消除传递依赖。范式虽减少冗余但可能降低查询效率,因此有时需反范式化,通过增加冗余字段来提升查询性能,但会增加存储空间和维护成本。实际设计中需权衡范式规范与查询效率,根据数据量和查询需求选择合适的范式级别。
2025-08-16 22:14:44
2070
2
原创 MySQL的索引优化与查询优化:
本文总结了SQL查询优化的关键技术,主要包括三方面:查询优化(物理优化如索引、表连接方式,逻辑优化如SQL等价变换)、索引优化(联合索引最佳左前缀法则、避免计算/函数转换、范围查询影响等)和关联查询优化(驱动表选择、join原理及优化方法)。特别强调了覆盖索引和索引下推的重要性,前者可避免回表操作,后者能在索引层面过滤更多数据。此外还涉及子查询、排序、分组、分页等场景的优化建议,以及避免使用select *等实用技巧。
2025-08-16 15:58:45
1273
原创 MySQL的分析查询语句(EXPLAIN):
摘要:EXPLAIN用于分析SQL执行计划,展示MySQL查询过程。关键字段包括:id(查询顺序)、select_type(查询类型)、type(访问方式效率)、possible_keys(可能索引)、key(实际索引)等。其中type从高到低效率排序为system>const>eq_ref>ref>range>index>ALL。Extra字段提供额外信息,如using filesort;(需优化排序)、using temporary(需避免临时表)。优化建议包括减少查询趟数、利用索引覆盖、降低扫描行数等
2025-08-15 17:13:37
564
原创 MySQL的索引(索引的创建和设计原则):
MySQL索引类型及设计原则摘要 MySQL支持多种索引类型,包括主键索引、唯一索引、普通索引、单列/多列索引等。索引创建方式包括建表时指定、ALTER TABLE和CREATE INDEX语句。8.0版本新增隐藏索引功能,可避免直接删除索引带来的风险。 设计索引时应考虑:为唯一性字段、频繁查询条件和排序字段创建索引;多表连接时对连接字段建索引;使用较小数据类型和字符串前缀;将区分度高和常用字段放在联合索引左侧。同时要避免对数据量小、重复数据多或频繁更新的表创建过多索引,并定期清理冗余索引,合理使用索引。
2025-08-14 20:38:26
1008
原创 MySQL索引(InnoDB的数据存储结构):
数据库存储结构采用多级层次设计:页(16KB)是基本I/O单位,包含文件头、用户记录等7部分;多个页组成区(1MB)以提高顺序I/O效率;段由零散页和完整区构成,对应不同数据库对象;表空间作为逻辑容器管理多个段。页内通过双向链表和目录结构实现高效检索,行格式设计包含变长字段、NULL值列表等优化存储。Compact行格式采用位图管理NULL值,通过垃圾链表处理删除记录,并自动添加隐藏列实现数据完整性。这种分层结构平衡了空间效率与查询性能,支持大规模数据管理。
2025-08-14 13:51:34
1019
原创 MySQL的索引(索引的数据结构-B+树索引):
数据库索引是提高查询效率的数据结构。B+树索引分为聚簇索引(数据与索引共存)和非聚簇索引(仅存储位置)。InnoDB引擎采用聚簇索引,主键查询高效但维护成本高;MyISAM使用非聚簇索引,数据和索引分离。聚簇索引存储完整数据,一个表只能有一个;非聚簇索引可多个,但需"回表"操作。B+树通过分层查找减少I/O次数,查询时从根节点二分查找直至叶子节点,若非完整数据则需回表获取。索引优化需权衡查询速度与维护成本。
2025-08-11 20:40:44
1094
原创 MySQL的存储引擎:
本文对比分析了MySQL主要存储引擎的特点与应用场景:InnoDB作为默认引擎支持事务、行级锁和外键,适合高并发写操作,但占用空间较大;MyISAM读写速度快但不支持事务,适合以读为主的应用;Archive具有高压缩率,适合日志存储;Memory基于内存速度快但数据易丢失,适合临时数据;CSV便于数据导入导出;Federated实现跨服务器访问。不同引擎在事务支持、并发控制、存储机制等方面各有优劣,应根据具体业务需求选择合适的存储引擎。
2025-08-10 20:32:26
839
原创 MySQL的逻辑架构和SQL执行的流程:
MySQL采用C/S架构,客户端与服务器通过TCP连接交互,遵循MySQL协议。服务器结构分为三层:连接层负责身份验证和权限管理;服务层处理SQL解析、优化和执行;引擎层通过插件式存储引擎实现数据存储。查询流程包括:查询缓存(8.0已移除)、解析器生成语法树、优化器选择执行计划、执行器调用存储引擎API获取数据。该架构支持多种存储引擎,实现了查询处理与数据存储的分离。
2025-08-10 17:37:10
1082
原创 MySQL的触发器:
MySQL触发器是一种与表关联的特殊存储程序,在指定事件(INSERT/UPDATE/DELETE)发生时自动执行。通过CREATE TRIGGER语法创建,可设置在操作前(BEFORE)或后(AFTER)触发,支持单条SQL或复合语句块。触发器能确保数据一致性、记录操作日志和数据校验,但存在可读性差、不易维护的缺点。可通过SHOW TRIGGERS查看触发器,使用DROP TRIGGER删除。需注意外键约束可能影响触发器的激活。
2025-08-08 22:16:32
973
原创 MySQL的变量、控制流程和游标:
摘要:本文详细介绍了MySQL数据库中变量的分类和使用方法。变量分为系统变量(全局和会话级别)和用户变量(会话用户变量和局部变量)。系统变量定义MySQL实例属性,用户变量用于存储过程和数据操作。文章还阐述了条件处理、流程控制(分支、循环结构)以及游标的使用步骤,包括声明、打开、使用和关闭游标。最后指出游标虽能提高数据处理效率,但可能带来性能问题。文章全面覆盖了MySQL编程中的关键元素,为开发者提供了实用指导。
2025-08-07 23:36:13
1141
原创 MySQL的存储过程和存储函数:
MySQL存储过程与存储函数详解 存储过程是预先编译并存储在数据库中的可重用代码块,具有简化操作、提高效率、增强安全性等优势。存储过程支持三种参数类型(IN/OUT/INOUT),创建时需使用DELIMITER修改结束符。调用方式为CALL存储过程名(),可返回零或多个值,常用于数据更新操作。 存储函数与存储过程类似,但必须返回单一值且调用方式为SELECT函数名(),常用于查询场景。两者都可通过SHOW、ALTER、DROP命令进行查看、修改和删除。支持事务和表操作创建时需注意处理权限和确定性声明等问题。
2025-08-07 16:08:38
826
原创 MySQL的视图:
摘要:视图是数据库中的虚拟表,基于SELECT查询定义,不存储实际数据。视图可以简化查询、保障数据安全、适应需求变化,并能分解复杂查询逻辑。创建视图基于基表或已有视图,支持查看、更新和删除操作(但更新操作有限制)。优点包括操作简单、减少冗余、数据安全等;缺点在于维护成本高,特别是嵌套视图。建议视图主要用于查询而非数据更新,对数据的修改应直接操作基表。视图与实际数据表保持同步,修改任一方都会影响另一方。
2025-08-07 11:23:25
655
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅