- 博客(89)
- 收藏
- 关注
原创 C++20协程
本文介绍了C++协程的基础知识,包括协程的运行机制、组成部分和实现方式。协程分为有栈和无栈两种,C++常用无栈协程,它支持挂起和恢复执行。协程主要由协程状态、承诺对象、协程句柄和等待体组成。文章通过三个示例展示了协程的使用:例1使用co_yield逐步输出数字;例2用co_await模拟异步等待;例3演示了跨线程唤醒协程的正确实现方式。这些示例展示了协程在任务调度和异步编程中的应用潜力,为开发者掌握协程技术提供了基础指导。
2026-01-17 18:51:07
743
原创 WinZip项目前端
该摘要介绍了项目代码修改情况:屏蔽了涉及隐私的服务器交互和联运功能代码,导致程序关闭异常(可能与会员支付弹窗有关)。前端采用QML架构,翻译文件损坏影响布局。特别提醒不要点击会员/支付功能(原需连接已破产公司的服务器)。项目仅供学习,包含所需动态库,禁止商用并要求注明出处。主要包含PDF/视频压缩、证件照及支付界面(已禁用服务器交互功能)。
2026-01-08 10:12:42
209
1
原创 定时任务调度系统(二)
本文介绍了一个任务调度框架的设计实现,主要包括: 核心抽象接口AbstractExecutor定义了任务执行方式,并派生出多种执行策略:直接在当前线程执行的NoopExecutor、独立线程执行的NewThreadExecutor、异步执行的AsyncExecutor,以及维护任务队列的LooperExecutor。 结果处理结构体Result封装了任务返回值或异常信息,提供get_or_throw方法获取结果或抛出异常。 三种协程等待器实现: DispatchAwaiter:切换到指定执行器 SleepA
2026-01-07 20:38:39
315
原创 定时任务调度系统(一)
摘要:本文介绍了一个基于C++20协程实现的任务调度器,配合自实现线程池使用。核心类包含延迟执行任务封装(DelayedExecutable)、任务比较器(DelayedExecutableCompare)和调度器(Scheduler)。调度器采用优先级队列管理任务,通过条件变量实现定时唤醒,支持一次性任务和循环任务。循环任务通过递归lambda实现,可设置超时和停止条件。调度器提供优雅关闭机制,可选择等待任务完成或立即清空队列。该设计充分利用C++现代特性,实现了高效的任务调度功能。
2026-01-03 08:00:00
330
原创 自实现线程池
本文介绍了一个自实现线程池的设计方案。该线程池相比Qt全局线程池具有直接获取future结果和线程命名支持的特点。关键技术包括:1) 使用安全队列(SafeQueue)实现线程安全的任务管理;2) 跨平台线程命名方案(Windows通过kernel32模块,Linux限制15字符);3) 基于原子操作(atomic)的线程同步控制;4) 主循环采用条件变量避免忙等待;5) 提供submit模板方法支持任意函数和参数的提交,并返回future对象。该实现通过精细的同步机制和跨平台适配,提供了高效、安全的线程池
2026-01-02 16:10:25
790
原创 QML显示文件图标
本文介绍了一种在QML界面中显示Windows系统文件图标的方法。通过调用Windows API的SHGetFileInfo函数获取系统图标,并将其转换为QPixmap进行绘制。主要实现了以下功能:1)根据文件路径或扩展名加载对应图标;2)区分文件和文件夹类型;3)使用QtWin转换HICON为QPixmap并释放资源;4)重载paint函数实现高质量图标绘制。该方法可以保持界面与系统风格一致,且不依赖实际文件存在,仅需文件属性即可加载对应图标。
2026-01-02 14:20:46
270
原创 文件model(二)
本文介绍了压缩文件处理功能的实现细节,主要包括: 文件重命名功能:通过线程池异步执行,实时显示处理进度,避免界面假死 删除节点功能:支持批量删除,同样采用进度回调机制 默认程序检查:验证当前程序是否为支持格式的默认打开程序 文件数据管理:将文件节点数据移交给模型管理,支持路径设置和重置模型 这些功能通过多线程、回调机制和Qt模型视图框架实现,确保了操作的响应性和用户体验。
2025-12-31 00:16:51
371
原创 文件model(一)
摘要:本文实现了一个基于QAbstractListModel的压缩文件管理模型,采用单例模式设计并禁用拷贝/移动构造。模型维护一个文件列表(vector),提供追加、获取项数据等操作,使用自定义QT角色枚举定义数据字段。解压功能通过线程池实现,支持进度回调(计算方式为已处理字节/总字节*100)和中断控制,提供完整解压、部分解压和批量解压三种模式。排序功能可实时更新视图,所有操作均通过信号机制与界面交互。
2025-12-29 12:37:12
292
原创 文件压缩(三)
本文介绍了一个基于bit7z库的压缩文件管理系统,主要功能包括: 文件追加:支持文件和目录的树状结构压缩,通过addFile/addDirectory方法加入队列后压缩 文件操作:提供重命名(修改路径索引)、删除(批量删除指定索引项)功能 文件查看:创建临时目录解压文件后用系统默认程序打开 目录导航:支持返回上级目录和刷新当前目录 编辑器管理:根据压缩格式创建对应的编辑器/写入器,处理压缩等级、分卷大小等参数设置 系统采用互斥的编辑器模式(reader/writer/editor),自动处理路径分隔符差异,
2025-12-26 20:37:57
414
原创 文件压缩(二)
本文摘要: 该代码实现了一个压缩文件处理工具,主要功能包括: 错误处理机制(ZipResult类) 压缩包操作: 打开压缩包并读取内容到文件树结构 设置/获取密码及密码验证 解压功能: 支持全量解压和按索引解压 提供解压进度回调 使用bit7z库进行底层压缩操作 线程安全设计(使用共享锁保护共享资源) 日志记录功能 代码采用C++实现,使用了标准库和Qt框架的部分功能。
2025-12-23 18:51:38
567
原创 文件操作工具类(二)
摘要:该代码提供了一系列Qt文件处理工具函数,包括:获取文件名/后缀/绝对路径、遍历目录文件、获取图片分辨率、时间格式化、判断目录、复制到剪贴板以及文件关联操作。主要使用QFileInfo、QDir、QImageReader等Qt类实现文件系统操作,支持URL和本地路径转换,并包含日志记录功能。这些方法均为静态可调用(Q_INVOKABLE),便于在QML环境中直接使用。
2025-12-22 14:01:56
228
原创 文件工具类(一)
摘要:本文介绍了一个基于单例模式的文件辅助类FileHelper的实现。该类继承自Singleton模板,提供多种文件操作功能,包括:验证URL有效性、获取系统桌面路径、解析文件名/路径/大小、检查文件存在性、生成不重复文件名等。方法实现结合了Qt框架和Windows API,其中部分功能如文件大小获取提供了两种实现方式(Qt和Windows API)。类设计采用单例模式确保全局唯一实例,并通过友元声明实现模板类对私有成员的访问。代码展示了C++17的string_view用法以及Qt与原生API的混合编程
2025-12-21 18:08:09
300
原创 图片压缩处理(二)
摘要:本文介绍了基于OpenCV的图片处理函数实现方案。针对中文路径问题,提出使用ifstream二进制读取图片到缓冲区,再通过imdecode解码的方法。详细说明了图片裁剪函数的工作流程,包括参数校验、区域裁剪、尺寸调整和文件输出等步骤,采用异常处理机制确保稳定性。同时介绍了获取图像编码器的辅助函数实现原理。整个方案通过标准C++和OpenCV接口实现,具有较好的兼容性和错误处理能力。
2025-12-20 19:02:10
324
原创 图片压缩处理(一)
摘要:该项目是一个基于Windows GDI+的图片压缩工具,支持JPG和PNG格式。核心功能包括:1) 使用高质量双三次插值进行图片缩放;2) 提供质量参数压缩功能,其中JPG支持0-100质量调整,PNG采用固定24位RGB压缩;3) 实现文件大小控制功能,通过二分查找算法自动调整质量参数以达到目标文件大小。项目采用GDI+进行图像处理,包含完整的资源管理机制,但不支持跨平台,建议跨平台场景使用OpenCV替代。主要流程包括初始化、图像加载、参数计算、压缩处理和资源释放。
2025-12-20 00:07:47
335
原创 PDF压缩
本文介绍了WinnZip项目中PDF压缩功能的实现方法。主要使用Ghostscript命令行工具进行PDF压缩,支持三种压缩等级(小/中/大尺寸)和无损压缩选项。实现包括:1)文件存在性检查;2)根据参数动态构造Ghostscript命令;3)通过CreateProcess执行命令并获取结果。核心函数compressPDF整合了文件检查、命令构造和执行流程,并处理异常情况。该方案利用开源工具实现了高效的PDF压缩功能,适用于不同压缩需求场景。
2025-12-18 20:13:35
312
原创 excel列名与数字转换
这篇文章介绍了一种将数字转换为Excel列名(如A、B、AB等)的算法。作者最初考虑使用映射表方法,后来采用26进制转换思路,通过将数字减去1后对26取余数来确定对应字母('A'+余数)。算法实现中,对于小于26的数直接转换,大于26的数则循环取余和除法运算,并将结果逐个插入字符串开头。该方法巧妙地将数字映射为Excel列名,实现了高效的数字到字母的转换。
2025-11-20 16:25:54
243
原创 寻找字符串问题研究
文章摘要:本文探讨了字符串查找的两种实现方法。第一种是利用C++ string的find函数直接查找,简洁高效,通过判断返回值是否为npos确定查找结果。第二种是暴力遍历法,通过逐个字符比对来查找目标字符串,需要注意处理边界条件防止越界访问。两种方法都能实现strStr功能,但前者更简洁,后者则展示了基础实现原理,适合理解底层机制。
2025-11-12 16:25:44
139
原创 删除有序数组中的重复项
使用哈希集合自动去重:该解法利用unordered_set的自动去重特性,将数组元素存入集合后再转回数组。虽然代码简洁,但破坏了原数组顺序且效率不高(时间复杂度O(n)),适合快速解决去重问题但不保留元素顺序的场景。
2025-11-11 16:56:24
361
原创 无重复字符串的最长子串
本文介绍了一个寻找字符串中最长无重复字符子串的算法。通过滑动窗口和哈希集合实现高效检测,当右指针遇到重复字符时左指针右移,否则右指针继续扩展窗口。时间复杂度O(n),空间复杂度O(min(m,n)),其中m为字符集大小。示例验证了算法正确性,如"abcabcbb"返回3,"bbbbb"返回1等。该解法避免了暴力枚举,优化了性能表现。
2025-09-18 20:40:13
291
原创 链表相加问题
摘要:本文介绍了一个链表相加的问题,要求将两个逆序存储数字的链表逐位相加,返回结果链表。关键点在于处理进位和不同长度链表的情况。通过同时遍历两个链表,逐位相加并记录进位,最后处理可能的剩余进位。这种方法避免了直接转换数字可能导致的溢出问题,时间复杂度为O(max(m,n)),空间复杂度为O(max(m,n)),其中m和n分别是两个链表的长度。文中给出了C++实现代码,包括链表结构定义和解决方案类。
2025-09-18 17:51:25
483
原创 c++加载qml文件
本文介绍了C++加载QML文件的三种方式:1)使用QQmlApplicationEngine直接加载并获取根节点修改属性;2)使用QQuickView自动创建窗口;3)结合QQmlEngine和QQmlComponent手动创建。作者还分享了在CMake配置过程中遇到的问题,给出了Qt6项目的CMakeLists.txt配置示例,并强调了版本兼容性和库链接的重要性。三种加载方式各有特点,第一种最简单,第三种最灵活但需要手动管理对象生命周期。
2025-07-27 22:07:29
530
原创 qml定时器timer
接下来设计了一个红色边框的文本框,在里面每过一秒刷新时间显示出来,并添加鼠标操作,点击文本框后刷新的启动/停止。triggered() 触发处理事件的信号。qml定时器timer实现定期刷新界面。
2025-07-26 15:56:30
328
原创 qml状态
本文介绍了QML中状态(state)的使用方法。通过一个矩形示例,演示了如何利用states属性创建不同状态:默认状态显示红色矩形,当鼠标悬停时触发"onenter"状态,使矩形变为绿色并旋转45度。代码展示了State和PropertyChanges的基本用法,以及通过MouseArea的onEntered/onExited事件切换状态。文章还提到状态恢复的注意事项(Qt6.8+版本中空字符串不能恢复默认值),并简要提及when条件判断和StateChangeScript的扩展用法,建
2025-07-26 12:59:34
299
原创 qml的信号槽机制
本文介绍了QML与QtWidgets信号槽机制的主要区别及使用方法。QML信号槽分为自动绑定和手动绑定两种方式:自动绑定通过在信号名前加"on"并首字母大写实现(如onHaveClick);手动绑定则支持类似JavaScript箭头函数的语法或使用Connections组件。文章通过示例演示了无参和有参信号的绑定方法,包括onClicked触发、Component生命周期回调(onCompleted/onDestruction)等。特别指出QML5与QML6在connections用法上
2025-07-25 19:18:37
521
原创 7月2日面试问题
qt6商用的话是要交版权税的,市场目前还是用qt5,曲线绘制用的是qcustomplot外部库,简历的话没有写出亮点,比如说介入多少设备,什么效率,比以前有多少提升,主要是多少精度,Linux的shell脚本,uml写过哪些文档,单元测试写过哪些文档,单元测试和集成测试有什么区别。虽然我后来再网上查了下这家公司,是个 做军工外包的,网上说加班现象严重,待遇不太好什么的,我也不知道。不同的cpu内存的保存可能默认是小端也可能是大端,传输的时候需要约定大小端传输的问题,不然解析可能出问题。
2025-07-19 11:05:11
200
原创 6月30日面试问题
这篇面试反思总结了作者在技术面试中遇到的问题及回答情况。主要涉及多线程消息队列、串口访问、虚拟内存、条件变量、Q_OBJECT宏、算法复杂度等知识点。作者如实记录了自己的作答情况,并附上了标准答案作为对比,显示在部分概念理解上存在不足。文章最后反思指出,虽然这些知识点曾经学习过,但因使用频率低导致记忆模糊,强调了"温故而知新"的重要性。整体呈现了技术面试的典型问答场景和面试后的自我总结过程。
2025-07-02 00:46:21
890
原创 C++字符大小
摘要:该C++程序展示了不同数据类型在64位系统中的内存占用情况。通过sizeof运算符,程序分别输出了int(4字节)、short int(2字节)、long int(4字节)、long long int(8字节)、float(4字节)、double(8字节)、char(1字节)等基本数据类型的大小,以及包含两个int成员的结构体MyStruct的总大小(8字节)。结果表明,不同数据类型在内存中占用的空间大小存在显著差异,这有助于理解程序的内存使用情况。
2025-06-24 15:33:45
264
原创 C++string库研究
本文介绍了C++中string类的构造函数及其相关操作。通过示例程序展示了string的多种构造方式(如字符填充、拷贝构造等)和基本操作(字符串拼接、修改等)。还介绍了C++11新增的移动构造和列表初始化构造。此外,文章详细说明了string类的三种输入方式(cin>>、getline、get)和迭代器的使用(begin/end、rbegin/rend等)。最后介绍了与字符串容量相关的函数,如length/size、capacity、empty、clear以及reserve和resize等操作,
2025-06-24 15:00:12
541
原创 Qthread应用
本文介绍了使用Qt多线程实现随机数生成与排序功能的方法。通过继承QThread类创建了三个子线程:Generate线程生成随机数数组,Bubblesort线程进行冒泡排序,Quicksort线程实现快速排序。关键点包括:1)通过信号槽机制实现线程间数据传递;2)使用QElapsedTimer计时器测量运行时间;3)主线程负责UI更新,避免卡顿。程序演示了大数据量时(如10000个数字)两种排序算法的效率差异,冒泡排序耗时明显更长。这种设计有效解决了主线程阻塞问题,提升了用户体验。
2025-06-21 17:31:43
962
原创 Qstackwidget研究
本文介绍了如何使用QStackedWidget实现多界面切换功能。通过将多个QWidget页面叠加在容器中,配合导航栏按钮切换显示指定页面。文中建议采用UI设计工具布局后,使用lambda表达式简化信号绑定,避免逐个编写槽函数。具体实现包括:1)创建QStackedWidget容器并用addWidget添加页面;2)用connect将按钮点击事件与页面切换绑定。这种方法比手动编写代码更高效,最终实现点击不同按钮即可切换对应页面的效果。
2025-06-17 01:18:52
240
原创 qtwidget嵌入qml
摘要:本文介绍了在Qt Widget界面中嵌入QML组件的方法。通过创建QQuickWidget容器,加载QML文件并设置尺寸自适应,实现QML与Widget的混合开发。文中提供了详细的代码示例,展示了一个简单的QML矩形组件嵌入过程。对于可能出现的库连接错误,给出了三种解决方案:检查QtQuick模块安装情况、确认.pro文件配置以及删除build文件重新编译。该方法为传统Widget程序引入QML提供了可行方案。
2025-06-16 00:16:53
447
原创 QML显示图片问题解决办法
文章摘要:在使用QML显示qrc资源图片时遇到无法加载的问题,发现原因是CMake配置不当。在Qt Creator自动生成的qt_add_qml_module中添加了resource语句,但实际上需要改用qt_add_resources命令。正确做法是:1)删除自动生成的resource语句;2)添加qt_add_resources(别名 qrc文件名);3)在文件系统中加入${别名};4)在qt_add_qml_module的SOURCES参数中添加${别名}。这样修改后即可正常访问qrc资源中的图片。该
2025-06-11 20:00:45
500
原创 二叉树深度计算
本文介绍了两种计算二叉树深度的方法:递归法和迭代法。递归法采用深度优先遍历,通过比较左右子树的最大深度加1返回当前深度;迭代法使用广度优先遍历,借助队列逐层统计深度。两种方法分别通过递归调用和层序遍历实现,最终都能准确计算出二叉树的最大深度。测试用例演示了两种方法在相同二叉树上的计算结果一致,验证了算法的正确性。
2025-05-29 10:00:00
621
原创 使用栈实现队列功能
本文介绍用双栈模拟队列的实现方法。通过设计输入栈(instack)和输出栈(outstack),入队操作直接压入instack,出队时若outstack为空则将instack元素全部转移到outstack再弹出。这种设计使得入队时间复杂度为O(1),出队操作在摊还分析下也为O(1)。关键点在于利用栈的LIFO特性,通过元素转移实现了队列的FIFO特性。文中提供了C++实现代码,并分析了各操作的时间复杂度。
2025-05-28 16:06:04
311
原创 单链表反序实现
摘要:链表反转可通过迭代或递归实现。迭代法使用三个指针(prev、curr、next)逐步调整节点指向,时间复杂度O(n),空间复杂度O(1)。递归法则将问题分解为头节点和子链表,通过递归调用反转子链表后调整指针方向,时间复杂度O(n),空间复杂度O(n)(栈空间)。两种方法最终都将链表反转为5→4→3→2→1的形式,其中递归法需注意每次调用创建新变量和调用栈的特性。
2025-05-28 15:46:34
943
原创 c++算法题
文章摘要:本文讨论字符串替换操作replace的实现方法,重点分析在笔试场景下的可行方案。首先解释了替换操作的定义:若t是s的子串,则用v替换t在s中的所有出现。针对笔试限制,作者提出两种思路:1)通过滑窗遍历记录匹配位置,但实现较复杂;2)更实用的方法是用string的find和replace函数。最后给出具体实现代码,通过循环查找和替换子串,并更新查找起始位置来避免重复处理。
2025-05-26 21:56:50
329
原创 c++算法题
本文探讨了基于数组实现的循环队列操作。队空条件为length=0,队满条件为length=m。插入操作(enqueue)首先检查队列是否已满,未满时在rear位置插入元素,rear指针循环移动(rear=(rear+1)%m),并增加length。删除操作(dequeue)通过rear和length计算队头位置(front=(rear-length+m)%m),取出元素后仅减少length,实现逻辑删除。关键点在于利用取模运算实现指针循环移动,以及通过length变量简化队头位置计算,避免单独维护front
2025-05-26 18:31:11
323
原创 编写一个算法frequency,统计在一个输入字符串中各个不同字符出现的频度。用适当的测试数据来验证这个算法
本文介绍了四种统计字符串字符频率的C++实现方法:1)数组索引法,通过ASCII码映射到固定数组;2)std::map容器实现有序键值对统计;3)std::unordered_map实现无序统计;4)std::count逐个字符统计法。每种方法都给出了代码示例和测试用例,处理范围为0-9数字和A-Z字母,忽略非法字符。测试案例包括混合字符、含非法字符及空字符串情况,验证了各方法的正确性。这些实现展示了不同数据结构在字符频率统计中的应用差异。
2025-05-26 17:38:02
842
原创 输入一个字符串,将其逆序后输出
本文介绍了四种反转字符串的方法:1)使用标准库reverse函数直接反转;2)双指针原地交换首尾字符;3)利用反向迭代器构造新字符串;4)递归逆序输出(不修改原字符串)。每种方法都给出了C++实现代码示例,输入"HelloWorld"可输出反转结果"dlroWolleH"。这些方案涵盖了不同的实现思路,包括库函数调用、指针操作、迭代器构造和递归技术。
2025-05-26 17:09:39
390
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅