自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 QT编程(20): Qt QListWidget QTreeWidget介绍

QListWidget是基于项(Item)的列表控件,继承自QListView,本质是“便捷类”——将数据存储与视图展示功能集成在一起,无需依赖外部数据模型,直接通过QListWidgetItem对象管理每一个列表项,适用于展示无层级关系的单层数据列表,开发成本低、学习曲线平缓,是Qt中实现简单列表功能的首选控件。

2026-03-24 15:20:09 506

原创 QT编程(19) : Qt 实现自定义delegate

以下实例实现一个“自定义进度条Delegate”,用于在QTableView中显示进度(0-100),支持编辑(通过QSpinBox修改进度值),同时自定义进度条颜色、文字显示。// 1. 创建模型(QStandardItemModel)// 5行2列model->setHorizontalHeaderItem(0, new QStandardItem("任务名称"));model->setHorizontalHeaderItem(1, new QStandardItem("完成进度"));

2026-03-24 15:15:58 500

原创 QT编程(18): Qt QItemSelectionModel介绍

QItemSelectionModel是Qt模型/视图框架中实现“选中功能”的核心组件,其核心价值在于解耦选中状态的管理与视图、模型,提供了丰富的接口用于选中操作、状态查询和信号响应,支持单个、多个、连续范围等多种选中场景,适配表格、树状、列表等各类视图。掌握其SelectionFlag、核心接口及与视图的配合方式,能快速实现灵活、高效的交互式选择功能,是Qt桌面应用开发中不可或缺的知识点。

2026-03-23 14:01:55 538

原创 QT编程(17): Qt 实现自定义列表模型

/ 自定义数据结构体// 姓名int age;// 年龄// 性别// 声明自定义列表模型Q_OBJECTpublic:// 构造函数,传入父对象// 1. 创建自定义模型// 2. 创建视图(QListView)// 3. 绑定模型与视图// 4. 可选:设置视图为可编辑(双击item可编辑)// 5. 布局设置// 示例:添加新数据(对外接口调用)model->addUser(UserInfo{"赵六", 22, "女"});

2026-03-23 13:55:28 494

原创 QT编程(16): Qt Model

专为列表型数据设计,简化了单列数据模型的开发,提供了常用函数的默认实现,适合实现简单的单列列表数据(如下拉框选项)。:专为表格型数据设计,简化了多列多行数据模型的开发,无需手动处理行与列的索引关系,适合实现表格类数据展示(如数据报表)。

2026-03-22 15:30:22 443

原创 QT编程(15): Qt 按键事件和定时器事件

作用:捕获用户键盘操作(按下、释放、长按),支持方向键、字母键、功能键(F1-F12)、组合键(如 Ctrl+C)等,是 Qt 交互类程序的基础。核心要点:需重写QWidget:按键按下时触发(最常用);:按键释放时触发;中,通过判断是否为长按重复触发(默认开启,可关闭)。通过获取按键标识(如Qt::Key_Up方向上键、Qt::Key_AA键)。若要忽略当前按键事件,调用;若要拦截(不传递给父组件),调用。

2026-03-22 15:15:14 479

原创 Qt编程(14): 常用的鼠标事件

按钮点击、复选框切换:用或;(开始拖拽)+(拖拽过程)+(结束拖拽);wheelEvent;+ 开启鼠标跟踪;。

2026-03-21 11:14:17 316

原创 QT编程(13): Qt 事件机制eventfilter

在 Qt 事件机制中,**eventFilter(事件过滤器)**是一种灵活的事件拦截与处理机制,允许一个对象(过滤器对象)拦截并处理另一个对象(被过滤对象)的事件,无需修改被过滤对象的源码,实现“外部干预”事件流转的效果,是 Qt 中事件处理的核心扩展方式之一。

2026-03-21 11:09:51 581

原创 QT编程(12): QDragEvent事件

Qt拖放事件的核心是。

2026-03-15 12:32:19 528

原创 QT编程(11):Qt 文本高亮实现代码编辑器

基础代码编辑、行号显示、关键字/注释/字符串区分高亮四大核心功能,适配C/C++基础语法高亮规则,可轻松拓展到Python、Java等其他语言。

2026-03-15 09:34:04 366

原创 QT编程(10): QLineEdit

QLineEdit是Qt Widgets模块中,专门用于处理短文本内容的交互,仅支持单行纯文本输入,不支持换行和富文本格式,是Qt界面开发中短文本交互的核心组件,几乎所有需要简短文本录入的场景都会用到该控件。:QLineEdit 直接继承自 QWidget,属于基础桌面控件,不自带滚动区域,文本过长时会自动显示省略号或支持光标横向滚动,结构轻量化,内存占用低、渲染速度快,适配各类轻量化短文本交互需求。:主打。

2026-03-14 16:20:21 444

原创 QT编程(9): QTextEdit

QTextEdit是Qt框架中,属于Qt Widgets模块的核心组件,专门用于处理多行文本内容,同时支持纯文本与富文本格式,是Qt中处理复杂文本场景的首选控件。:QTextEdit 继承自 QAbstractScrollArea,而 QTextBrowser 又继承自 QTextEdit,这意味着它天生自带滚动条功能,无需额外配置即可处理超长文本的滚动显示,适配不同窗口尺寸下的文本展示需求。

2026-03-14 16:11:24 483

原创 QT编程(8): qt自定义菜单项

依托Qt自带的QMenu、QAction,配合Qt Style Sheet(QSS)定制外观,无需重写控件类,直接修改菜单、菜单项的背景、 hover效果、选中态、文字样式、图标间距,适配绝大多数常规自定义需求,上下文和原有菜单逻辑完全兼容,不会破坏原有菜单弹出、关闭、触发事件流程。针对需要嵌入按钮、输入框、进度条、自定义布局的场景,需要继承重写自定义控件,再将该Action添加到QMenu中,实现完全自定义的菜单项。

2026-03-13 18:55:49 413

原创 QT编程(7): Qt主窗口和菜单栏

Qt中专门用于搭建应用主界面的核心类是,它是QWidget的子类,自带标准化的窗口布局结构,也是开发桌面应用最常用的主窗口类型,区别于普通QWidget,它内置了菜单栏、工具栏、中心部件、停靠窗口、状态栏五大核心区域,且,这是新手最容易忽略的基础规则。

2026-03-13 10:27:39 493

原创 C++基础(8): 指针类型

指针 = 存地址的变量,&取地址,*解引用找数据指针类型必须和指向变量的类型一致指针先赋值(指向有效地址),再使用,杜绝野指针数组名就是首元素指针,指针遍历数组更灵活指针做函数参数,实现传址调用,修改原始数据零基础学习指针,不用一开始深究底层原理,先把语法、运算符、基础用法练熟,多写几遍入门代码,慢慢就会理解指针的灵活之处,后续再深入学习多级指针、动态内存分配就轻松了。

2026-03-12 19:32:04 755

原创 C++基础(7):引用类型

数据类型 & 引用名 = 原变量名;& 在这里不是取地址符,是引用的声明符号,和指针的取地址要区分开!引用就是变量的别名,必须初始化、绑定后不可更改,和原变量同地址、同内存,主要用来做函数参数,实现直接修改原变量、节省内存开销,用法简单且安全,是C++新手必须掌握的基础语法。

2026-03-12 10:42:17 291

原创 C++基础(6):extern解决重定义问题

全局变量/函数的跨文件声明:修饰全局变量/函数时,默认表示“该符号具有外部链接属性,在其他编译单元中定义,当前仅为声明”,不分配内存,从根源避免重复定义。C与C++混合编程:搭配extern "C"使用,解决C和C++编译器函数名修饰规则不同导致的链接错误,本文重点讲解决重定义的基础用法。关键语法规则:→ 纯声明,无内存分配;如果写成→ 变成定义,会分配内存,依然可能重定义(严禁头文件这么写)。修饰函数:函数默认自带extern属性,和效果完全一致,都是声明;只有写完整函数体才是定义。

2026-03-11 15:55:16 276

原创 C++基础(5): 头文件与源文件

头文件是C++中用于声明代码的文件,后缀固定为**.h或.hpp**(.hpp多用于C++专属头文件,兼容C和C++混合编程),核心作用是对外“暴露”接口,告诉编译器有哪些函数、类、常量、结构体可以使用,但不存放具体实现逻辑。我们常用的标准库头文件,比如、、,都属于头文件,里面只包含各类标准功能的声明,调用时才会链接对应的实现。自定义头文件则用于封装项目里的公共接口,方便多个源文件共享调用。头文件和源文件的分离设计,是C++面向过程和面向对象编程的基础,核心价值是代码复用、模块化管理、隐藏实现细节。

2026-03-11 15:17:45 298

原创 QT编程(6):QT布局与页面切换

Qt 布局与页面切换的核心是“分而治之”:页面内部用基础布局完成排版,页面之间用 QStackedWidget 管理,通过信号槽实现解耦的导航逻辑。工程中应优先采用页面基类 + 键值映射 + 延迟加载的模式,兼顾可维护性与性能。需要我补充 Qt Designer 可视化设计的步骤(如如何在 UI 文件中添加 QStackedWidget 并关联信号槽),或提供完整的可运行项目代码吗?

2026-03-10 16:59:25 376

原创 QT编程(5):几种常用的对话框

当标准对话框无法满足需求时,可自定义QDialog子类,打造专属模态弹窗,Qt6推荐用open()非阻塞+信号槽方式调用,适配模态切换场景,避免exec()阻塞卡死。新建类继承QDialog,设计UI布局(拖拽控件或代码编写);设置模态属性:setModal(true)(应用级模态)或setWindowModality(Qt::WindowModal)(窗口级模态);用open()弹出,绑定finished信号处理关闭逻辑,调用deleteLater()释放内存。// 自定义对话框类Q_OBJECT。

2026-03-10 13:45:00 490

原创 QT编程(4):Qt6模态对话框切换

Qt6实现模态对话框切换,本质就是非阻塞弹出+信号监听+生命周期管理,牢牢抓住open()替代exec()finished信号触发切换、释放内存这三个关键点,就能实现无卡顿、无异常的流畅切换,这套写法适配Qt6所有桌面端项目,也是Qt6官方推荐的标准UI交互规范。

2026-03-10 08:54:52 395

原创 C++基础(4): 封装

封装的本质是将对象的属性(数据)和操作属性的方法(行为)捆绑整合为一个独立单元,同时隐藏内部实现细节,仅对外暴露有限、可控的公共接口,实现“数据隐藏+功能聚合”。通俗理解:封装就像日常使用的手机,内部的芯片、电池、电路板属于隐藏的内部细节,用户无法直接拆解修改;而屏幕触控、按键、充电口等是对外暴露的接口,用户通过这些接口正常使用手机功能,既保护了内部组件安全,又简化了使用成本。数据与行为绑定:把相关的属性和操作方法归到同一个类/对象中,避免数据和逻辑分离,提升代码内聚性,让代码结构更规整。访问权限控制。

2026-03-09 16:58:07 2496

原创 Qt编程(3): 信号和槽函数

Qt6 中自定义信号槽规则不变,依然需要继承 QObject + Q_OBJECT 宏,信号只需声明无需实现,槽函数正常编写即可。

2026-03-08 17:45:00 527

原创 QT编程(2):模态对话框和非模态对话框

模态对话框:用exec()显示,阻塞交互和代码执行,适合需要用户优先处理的场景(如确认、登录)。非模态对话框:用show()显示,不阻塞,需堆创建+避免内存泄漏,适合工具面板等无需优先处理的场景。核心区别:是否阻塞用户对其他窗口的操作,以及是否阻塞代码执行。

2026-03-08 10:52:58 293

原创 QT编程(1):Qt项目创建与编译

开始创建项目前,需确保已完成Qt环境安装,核心组件齐全:已安装(官方IDE,项目管理、编码、编译一体化工具)已配置可用:Windows推荐MinGW/MSVC编译器,Linux推荐GCC,Mac推荐Clang已安装对应Qt版本库(建议选择LTS长期支持版,稳定性更强)环境校验:打开Qt Creator,点击顶部菜单栏【工具】-【选项】-【Kits】,查看已配置套件无红色报错,编译器、Qt版本、调试器均正常关联,即可开始创建项目。

2026-03-08 10:31:19 460

原创 C++基础(3)存储区与编译过程详解

栈区自动管临时数据,堆区手动管大数据,全局静态区管长期数据,常量区管只读数据,代码区管执行指令。新手先分清栈区和堆区,这是最核心、最容易出错的两个区域。

2026-03-07 20:56:44 323

原创 C++ 网络编程(22) beast网络库实现websocket服务器

作用:汇总项目所有依赖头文件,定义命名空间别名,防止头文件重复包含,作为项目基础头文件。

2026-03-07 15:50:26 238

原创 C++asio网络编程(21)beast网络库实现http服务器

前面的几篇文章已经介绍了如何使用asio搭建高并发的tcp服务器,以及http服务器。但是纯手写http服务器太麻烦了,有网络库beast已经帮我们实现了。这一期讲讲如何使用beast实现一个http服务器。

2026-03-07 09:46:56 83

原创 IOServicePool多线程IO模型详解:原理、实现与实战指南

/ 单例模式实现多IO上下文线程池public:// 禁用拷贝和赋值,保证单例唯一性// 获取单例实例// 获取下一个IO上下文(负载均衡)// 停止线程池,优雅退出// 获取线程池大小private:// 私有构造,默认线程数为CPU核心数// 线程池大小// 原子计数器,用于轮询负载均衡// IO上下文实例数组// 工作守护对象数组,防止上下文提前退出// 工作线程数组// 线程安全标志。

2026-03-07 01:00:00 738

原创 IOThreadPool多线程模型详解:原理、实现与实战优化

include "Singleton.h" // 单例模板,需自行实现或用标准单例// 禁用拷贝构造与赋值,保证单例唯一性public:// 工作守护对象,防止io_context.run()提前退出// 获取全局IO上下文,供外部注册IO事件// 停止线程池,安全回收资源private:// 私有构造,默认线程数为CPU核心数// 全局唯一IO上下文// 工作守护对象集合,每个线程对应一个,保证run持续运行// 工作线程集合。

2026-03-07 00:15:00 391

原创 C++基础(2)变量作用域与大小

数组大小 = 单个元素大小 × 数组元素个数,连续内存存储,sizeof(数组名)可直接获取总大小。示例:int arr[5] = {1,2,3,4,5};全局变量和静态局部变量存静态存储区,内存常驻,大小不受栈空间限制;普通局部变量存栈区,大小受限,生命周期短;同名不同作用域的变量,内存地址和大小相互独立,互不干扰;函数形参属于局部作用域,存栈区,大小和对应实参类型一致;动态分配的变量(new/malloc)存堆区,作用域由指针控制,大小由类型决定,需手动释放内存。

2026-03-06 20:17:58 313

原创 C++基础(1)变量与输出

C++是强类型语言,用变量必须先定义数据类型int:装整数(没有小数点的数,比如1、100、-5)double:装小数(带小数点的数,比如3.14、0.5、-2.7)变量名:给盒子起名字,不能乱起,规矩很简单:只能用字母、数字、下划线,不能用中文、符号不能以数字开头(比如1age是错的,age1是对的)不能用C++关键词(比如cout、int、main不能当变量名)建议起有意义的名字(比如age代表年龄,score代表分数)赋值:往盒子里放数据,用等号=(注意:这里的=是赋值,不是数学里的等于)

2026-03-06 20:02:07 385

原创 C++asio网络编程(20)实现http服务器详解

Asio实现HTTP服务器,核心是依托io_context调度I/O事件,通过acceptor监听连接,socket完成数据交互;同步版适合入门学习,异步版凭借非阻塞和智能指针生命周期管理,实现高并发稳定运行。严格遵循HTTP协议格式,做好异常处理和内存管理,就能搭建出轻量化、高性能的C++ HTTP服务器,适配嵌入式、后端服务等多种场景。

2026-03-06 19:23:20 521

原创 C++asio网络编程(19) 利用协程实现并发服务器

C++ ASIO+协程的并发服务器方案,完美平衡了高性能和易用性,既保留了异步IO的极致性能,又通过协程让代码逻辑回归同步化,是C++高并发网络编程的最优解之一。核心优势总结:单线程万级并发,无线程切换开销,性能远超多线程模型代码简洁易维护,无回调地狱,调试难度大幅降低原生C++20标准,无第三方依赖,跨平台兼容拓展性强,支持TCP/UDP/SSL/HTTP等全场景网络编程新手可直接运行本文代码,快速搭建协程服务器,进阶可在此基础上优化并发策略、添加业务逻辑,适配各类工业级网络服务场景。

2026-03-06 14:27:33 456

原创 C++ 网络编程(18) 使用asio协程搭建异步服务器

协程是用户态轻量级执行单元,能在执行中主动暂停(挂起)并保留上下文,待条件满足后恢复执行,切换开销远低于线程;在你的Boost.Asio代码中,协程通过co_await等待异步IO(如读取客户端数据),挂起时不阻塞线程,IO完成后自动恢复,让异步代码像同步代码一样易读。可暂停、可恢复、用户态调度、低开销。awaitable标记协程函数,co_await实现挂起等待,依托io_context完成调度。核心价值:用同步写法实现异步IO,避免回调嵌套,提升代码可读性和并发效率。

2026-03-05 18:57:07 123

原创 C++ 网络编程(17) asio另一种多线程模型IOThreadPool

今天给大家介绍asio多线程模式的第二种,之前我们介绍了IOServicePool的方式,一个IOServicePool开启n个线程和n个iocontext,每个线程内独立运行iocontext, 各个iocontext监听各自绑定的socket是否就绪,如果就绪就在各自线程里触发回调函数。为避免线程安全问题,我们将网络数据封装为逻辑包投递给逻辑系统,逻辑系统有一个单独线程处理,这样将网络IO和逻辑处理解耦合,极大的提高了服务器IO层面的吞吐率。

2026-03-05 15:09:23 461

原创 为什么要用单例模式?

单例模式是软件开发中最常用的设计模式之一,属于创建型设计模式,它的核心定义是:确保一个类在整个程序运行生命周期内,有且仅有一个实例对象,并且为整个程序提供一个统一的全局访问点来获取该实例。看似简单的设计,背后是为了解决实际开发中的各类资源、数据、访问问题,核心使用原因主要有以下四点,每一点都对应实际项目的痛点:项目中很多类的实例化过程会消耗大量系统资源,比如数据库连接、线程池、日志对象、配置文件加载、硬件设备驱动、Redis客户端等。这类对象如果频繁创建、销毁,会极大占用内存、CPU和IO资源,导致程序卡顿

2026-03-05 13:46:48 421

原创 C++ 网络编程(16) asio多线程模型IOServicePool

IOServicePool本质上是一个线程池,基本功能就是根据构造函数传入的数量创建n个线程和iocontext,然后每个线程跑一个iocontext,这样就可以并发处理不同iocontext读写事件了。1   _ioServices是一个IOService的vector变量,用来存储初始化的多个IOService。2   WorkPtr是boost::asio::io_context::work类型的unique指针。 在实际使用中,我们通常会将一些异步操作提交给io_context进行处理,然后该操

2026-03-05 11:03:44 479

原创 C++asio网络编程(15) 服务器优雅退出

线程模型:主线程负责信号监听和退出控制,子线程运行 Boost.Asio 的 IO 事件循环,处理网络请求,实现业务与网络逻辑分离;优雅退出:通过捕获SIGINT(Ctrl+C)和SIGTERM信号,设置退出标记并唤醒主线程,避免强制终止导致的资源泄漏;资源优化:使用替代空循环,主线程挂起等待,大幅降低 CPU 占用;线程安全:通过互斥锁保护全局退出标记bstop,避免多线程竞争导致的逻辑错误;注意点:代码末尾多余的无实际作用,建议删除以简化代码。原生信号处理:使用 Boost.Asio 内置的。

2026-03-04 18:34:26 239

原创 C++asio网络编程(14) 利用单例逻辑实现逻辑类

单例模式模板类将无参构造,拷贝构造,拷贝赋值都设定为protected属性,其他的类无法访问,其实也可以设置为私有属性。析构函数设置为公有的,其实设置为私有的更合理一点。 Singleton有一个static类型的属性_instance, 它是我们实际要开辟类型的智能指针类型。 s_flag是函数GetInstance内的局部静态变量,该变量在函数GetInstance第一次调用时被初始化。以后无论调用多少次GetInstance s_flag都不会被重复初始化,而且s_flag存在静态区,会随着进程结束而

2026-03-04 17:31:07 282

空空如也

空空如也

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

TA关注的人

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