- 博客(117)
- 收藏
- 关注
原创 Qt窗口被外部(非Qt内部机制)强制销毁,第二次再重复使用不显示
摘要:本文分析了Qt开发中窗口被外部强制销毁的问题。当父窗口销毁时,Windows系统会自动发送WM_DESTROY消息递归销毁所有子窗口,导致Qt窗口对象状态不一致。问题源于在父窗口销毁后尝试解除父子关系的时序问题。文中对比了两种解决方案:1)每次创建新实例,彻底避免问题但性能略低;2)动态重设父窗口到活动窗口,需谨慎处理时序。最终建议根据实际需求选择方案,对于高稳定性要求推荐方案一,对于性能敏感场景可考虑方案二但需严格测试。
2025-07-05 23:39:19
637
1
原创 cereal无包装节点平铺展开容器内容的解决方案
本文提出了一种解决XML序列化中容器元素平铺展开问题的方案。针对传统XML序列化会将容器元素包装在父节点中的问题,通过三重机制实现无包装节点的平铺展开:1)层级重置机制允许重新遍历当前层级的子节点;2)动态分发机制根据节点类型分发到不同处理逻辑;3)节点跳过机制保持解析器位置正确移动。具体实现包括增强XMLInputArchive类的方法(skipNode、resetToLevelStart等),以及为Zoo结构体提供专用的序列化/反序列化方法,通过条件编译和模板特化实现针对XML格式的特殊处理
2025-07-04 09:00:00
533
原创 自定义Cereal XML输出容器节点
本文提出了一种优化Cereal序列化XML输出节点名称的方法,通过动态注册自定义节点名解决默认value0等无意义标签的问题。关键技术包括: 使用REGISTER_TYPE_NODE宏为类型注入静态函数,非侵入式地指定节点名称 通过SFINAE技术在编译期检测类型是否注册节点名,确保零运行时开销 利用ar.setNextName()覆盖默认命名逻辑,实现语义化XML输出 该方法可显著提升XML输出的可读性和数据处理效率,同时保持与Cereal反序列化的兼容性。测试表明,修改后节点名称能正确反映数据类型
2025-07-02 09:00:00
876
原创 Cereal中支持QString、QVector、QList、QMap
Cereal序列化库对Qt容器的支持实现 本文介绍了在C++序列化库Cereal中实现对Qt容器(QString、QVector、QList、QMap等)的序列化支持。针对Qt容器与STL容器的差异,作者提供了详细的解决方案: QString处理:通过特化XML输入/输出存档类,直接操作原始字节流,避免生成冗余XML节点,同时确保UTF-8编码转换的正确性。 动态容器(QVector/QList):使用make_size_tag标记容器大小,通过SFINAE技术区分序列化和反序列化逻辑
2025-07-01 22:56:55
974
原创 当类没有显式定义移动构造函数时,编译器会自动生成。默认生成的移动构造函数会对其所有成员变量执行移动操作
在C++中,当类没有显式定义移动构造函数时,编译器会自动生成一个。这个默认生成的移动构造函数会对其所有成员变量(包括基类成员)执行移动操作,即尝试调用每个成员自身的移动构造函数。
2025-07-01 19:14:22
791
原创 从样例出发了解序列库cereal的实现
C++序列化库cereal的实现分析 摘要:本文通过分析cereal序列化库的核心实现机制,探讨了其高效序列化的设计原理。重点研究了BinaryOutputArchive的构造过程,包括成员初始化、模板特化和基类构造。文章详细解析了cereal如何通过输出归档类(OutputArchive)管理指针映射、多态类型注册等元信息,并利用可变参数模板和完美转发实现通用序列化接口。分析表明cereal通过哈希表优化性能,支持多种标准库容器和智能指针,提供了比Boost更高效的序列化方案。
2025-06-29 10:46:40
613
原创 利用SFINAE检测成员函数
本文介绍了一种利用SFINAE技术检测类成员函数存在性的C++实现方案。通过定义access辅助类进行成员函数调用测试,结合decltype和std::declval在编译期检测函数可调用性。核心是使用宏CEREAL_MAKE_HAS_MEMBER_FUNC封装检测逻辑,生成has_member_xxx类型特征。最后通过PROCESS_IF和PROCESS_IF_NOT宏配合模板函数重载,实现根据成员函数存在性选择不同处理路径。该方案可用于反射、序列化等需要编译期类型检查的场景
2025-06-28 13:51:00
730
1
原创 优化Cereal宏 一行声明序列化函数
Cereal宏递归展开优化方案 本文提出了一种改进Cereal序列化库中宏递归展开的优化方案。通过设计CEREAL_PASTE宏系列,实现1-64个参数的自动扩展,相比传统递归宏展开方式具有以下优势: 多层宏展开结构:使用CEREAL_EXPAND确保二次展开,CEREAL_GET_MACRO实现参数数量检测 线性扩展机制:每个CEREAL_PASTEn宏只处理当前参数,其余参数传递给下一级宏
2025-06-28 13:30:43
638
原创 参考nlohmann json设计Cereal宏 一行声明序列化函数
摘要:本文介绍了一组用于Cereal序列化库的宏CEREAL_SERIALIZE_INTRUSIVE/NON_INTRUSIVE,通过一行代码即可自动生成结构体的序列化函数。该宏支持1-64个参数,自动处理成员变量到JSON的映射,并提供嵌套结构体支持。实现采用宏拼接技术,通过参数展开自动生成等效于手动实现的序列化代码,显著简化了Cereal库的使用流程,同时保持类型安全和灵活性。
2025-06-27 23:50:38
280
2
原创 通过事件过滤器拦截QRadioButton点击事件
摘要: 本文详细介绍了在Qt中使用事件过滤器拦截QRadioButton点击事件的方法。通过重写eventFilter函数,可拦截鼠标事件并弹出确认对话框,在用户确认后才允许切换选项。代码包含完整实现、批量安装过滤器、信号处理优化等步骤,并对比了事件过滤器、重写鼠标事件和信号阻塞三种方案的优缺点。最后提供了可直接运行的示例代码,适用于需要二次确认的选项切换场景。
2025-06-20 22:29:35
286
原创 QHashIterator与QMapIterator结合key_type、mapped_type的类型安全实践
摘要 本文探讨Qt关联容器QHash与QMap的类型安全迭代实践,重点介绍了使用::key_type和::mapped_type类型别名的优化方法。文章首先对比了两种容器的底层实现与特性差异,指出QHash基于哈希表提供O(1)访问但无序,QMap基于红黑树提供O(log n)访问且有序。通过结合decltype和容器内嵌类型别名,作者展示了如何实现与容器类型解耦的迭代器声明方案,确保代码在容器类型变更时的自动适应能力。文中包含单层容器迭代的详细示例,并扩展至嵌套容器的处理策略,包括使用可变迭代器进行元素修
2025-06-20 12:28:52
359
原创 类复制.省略 class.copy.elision
C++类复制省略(Copy Elision)机制解析;C++标准允许在特定条件下省略类对象的复制/移动构造,这一机制称为“复制省略”(Copy Elision)。该优化允许编译器将源对象直接视为目标对象,完全跳过复制/移动操作。适用场景包括:函数返回局部对象时的NRVO优化、抛出异常时的对象构造、协程参数传递以及异常处理中的对象别名化。尽管被省略的构造函数可能有副作用,编译器仍可进行优化。但在常量表达式求值和常量初始化时不允许此优化。该机制通过避免不必要的对象复制显著提升性能,是C++高效编程的重要特性。
2025-06-11 23:35:12
798
原创 关于有害的过度使用 std::move
本文讨论了在C++中过度使用std::move的危害。主要观点包括: 在函数返回值处使用std::move会阻止命名返回值优化(NRVO),导致不必要的移动操作而非直接构造。 在接收函数返回值时使用std::move会阻止初始化省略优化,同样造成额外移动操作。 错误的双重使用会从一个无拷贝/移动的理想情况变成创建两个临时对象、两次移动和两次析构的糟糕情况。 通过MSVC编译器的汇编代码对比,证明了正确写法(直接返回值和直接接收)能实现零拷贝/移动的最优效果,而错误写法会产生额外开销。 建议只在确实需要移动语
2025-06-11 23:09:43
836
原创 C++中auto&和auto&&
C++中auto&与auto&&的核心区别在于引用类型与绑定能力: auto&是左值引用,仅能绑定非临时对象,适合直接修改容器元素或避免拷贝; auto&&是万能引用,根据上下文推导为左值或右值引用,适用于泛型编程、完美转发和处理代理对象。 最佳实践: 修改原数据时优先用auto&,语义更明确; 处理未知类型或临时对象时用auto&&,但需注意右值生命周期。 避免错误场景:auto&不能绑右值,auto&&在简单场景可能降低可读性。
2025-06-09 22:46:55
1159
原创 在OpenGL中,齐次坐标的第四分量w用于区分几何实体的类型(点或向量)
在OpenGL中,齐次坐标的第四分量(w)用于区分几何实体的类型(点或向量),并直接影响其在变换矩阵作用下的行为。
2025-06-09 12:44:21
244
原创 设置QDialog的setModal(true)对show()无法阻塞
Qt对话框模态阻塞失效问题分析 摘要:当使用setParent(this)设置对话框父对象时,会导致setModal(true)无法阻塞父窗口。原因在于: 窗口标志变化:setParent(QWidget*)会清除Qt::Dialog类型标识,将对话框降级为普通嵌入式部件 模态依赖窗口类型:只有当窗口保留Qt::Dialog或Qt::Window标识时,模态设置才会生效 解决方案: 使用setParent(parent, windowFlags())显式保留窗口标志 或在构造函数中直接指定父对象
2025-06-08 17:02:56
718
原创 达梦使用存储过程实现删除重复记录、判断并添加主键和自增列的逻辑
本文介绍了达梦数据库中确保主键唯一性的存储过程实现方法。该存储过程包含三个主要功能:1)删除表中重复记录确保主键唯一性;2)检查并添加主键约束;3)检查并添加自增列属性。存储过程通过动态SQL实现这些功能,并提供了详细的使用说明和注意事项。调用时只需传入表名和列名参数即可自动完成相关操作,适用于不同表的批量处理。执行前建议做好数据备份,并确保用户具有足够权限。
2025-06-08 09:30:00
268
原创 QT中子线程触发主线程弹窗并阻塞等待用户响应
实现子线程安全触发主线程弹窗并阻塞等待: 一、使用QMetaObject::invokeMethod;二、使用QTimer::singleShot
2025-06-01 15:41:17
1311
原创 QT中子线程触发主线程弹窗并阻塞等待用户响应-传统信号槽实现
QT中子线程触发主线程弹窗并阻塞等待用户响应:在子线程执行耗时任务时,需暂停并触发主线程弹窗获取用户决策,子线程需阻塞等待响应后继续执行或终止。
2025-06-01 15:22:42
552
原创 QtConcurrent run中抛出异常在QFutureWatcher传递原理
QtConcurrent::run中抛出的QException子类异常,需通过`QFuture`的result()或waitForFinished()触发传递到主线程。
2025-06-01 13:25:23
596
原创 C++ 中虚继承与非虚继承的对比分析
虚继承:专为菱形继承设计,通过共享基类实例解决数据冗余和二义性,代价是内存和性能开销。实际开发中,优先避免过度多重继承,仅在必要时使用虚继承。
2025-05-08 12:04:17
581
原创 C++ lambda表达式的捕获原理
Lambda表达式本质是编译器生成的匿名类,通过重载operator()实现函数调用运算符。mutable修饰:移除operator()的const限定,允许修改副本。表达式定义时,后续外部变量修改不影响已捕获的值(引用捕获除外).
2025-05-07 20:10:33
1060
原创 QTableView复选框居中
QSS居中QTableView::indicator;自定义复选框委托类,实现在 QTableView 中居中显示复选框,并支持点击交互,结合原样式;
2025-04-29 00:00:42
824
原创 QTableWidget 中insertRow(0)(头插)和 insertRow(rowCount())(尾插)的性能差异
QTableWidget 中insertRow(0)(头插)和 insertRow(rowCount())(尾插)的性能差异
2025-04-03 22:35:02
851
原创 解决QSharedPointer栈变量的崩溃问题
QSharedPointer 必须管理 new 创建的堆对象?将栈对象交给 QSharedPointer 会导致运行时崩溃?
2025-03-31 22:21:19
329
原创 使用enable_if模板处理不同相同结构体c++14及C++17
使用enable_if模板处理不同相同结构体c++14及c++17一种常见错误是声明两个仅在默认模板实参上有别的函数模板。这样做是无效的,因为这些函数声明被当做同一函数模板的再声明(函数模板等价性中并不计入默认模板实参)。
2024-11-10 18:30:27
1190
1
原创 QToolBox先removeItem再addItem失败
QToolBox先removeItem再addItem失败。函数的调用推迟到当前函数执行完成后。这样,可以确保每次递归调用的深度不会超过函数栈的容量,避免了崩溃的问题。总结起来,通过定时器的延迟可以避免函数栈溢出,因为它将。
2023-12-30 23:22:35
632
1
原创 实现极坐标图表QPolarChart的角度轴范围是[0,360]时,0度在水平右侧
默认QPolarChart的范围是[0,360]时,0度在垂直上方。实现极坐标图表QPolarChart的角度轴范围是[0,360]时,0度在水平右侧
2023-11-23 00:07:58
1451
转载 CMake 保姆级教程(下)
通过得到的结果我们可以得到一个结论:在进行路径比较的时候,如果使用 PATH_EQUAL 可以自动剔除路径中多余的分割线然后再进行路径的对比,使用 STREQUAL 则只能进行字符串比较。在遍历列表的时候一共使用了两种方式,一种提供了多个变量来存储当前列表中的值,另一种只有一个变量,但是实际取值的时候需要通过。的方式来操作,注意事项:第一个列表对应的编号是0,第一个列表对应的编号是0,第一个列表对应的编号是0。的加强版,我们在遍历一个整数区间的时候,除了可以指定起始范围,还可以指定步长。
2023-09-03 00:12:49
554
转载 CMake 保姆级教程(上)
CMake 是一个项目构建工具,并且是跨平台的。关于项目构建我们所熟知的还有Makefile(通过 make 命令进行项目的构建),大多是IDE软件都集成了make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake等,如果自己动手写 makefile,会发现,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。而 CMake 恰好能解决上述问题, 其允许开发者指定整个工程的编译流程
2023-09-03 00:08:01
1083
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人