
Qt Framework相关
文章平均质量分 93
编码时空的诗意行者
十年互联网大厂老司机
展开
-
C++实现简化 QtBase(6):新增Timer定时器机制
在昨天的文章《》里,我们对EventLoop增加了Win32消息循环的支持。并支持post异步和延时任务。但是,还不支持timer的多次触发的定时器。今天我们一起来增加这个功能。原创 2024-07-03 14:33:20 · 1024 阅读 · 0 评论 -
C++实现简化 QtBase(5):通过IEventLoopHost扩展实现win32消息循环
今天,我们在之前的CEventLoop的实现之上,通过IEventLoopHost扩展,实现一个windows系统的主线程消息循环扩展,使得我们可以在主线程post task。原创 2024-07-02 15:17:36 · 705 阅读 · 0 评论 -
C++实现简化 QtBase(4):增加简单实用的事件机制
前面的文章已经实现了许多QObject的功能了:C++实现一个简单的Qt信号槽机制C++实现简化版Qt信号槽机制(2):增加内存安全保障C++实现简化版Qt的QObject(3):增加父子关系、属性系统但是,Qt中还有一个关键的功能是事件系统。为了让我们的QObject也支持事件系统,我们可以设计一套简单实用的事件机制。设计事件循环事件系统离不开事件循环,截止到C++ 20标准库里没有一套官方的事件循环机制,可能是因为实现一个事件循环也不是什么难事吧。为了简化我们的事件循环机制,我们用到了一原创 2024-07-01 17:23:10 · 578 阅读 · 0 评论 -
C++实现简化版Qt的QObject(3):增加父子关系、属性系统
前几天写了文章:C++实现一个简单的Qt信号槽机制C++实现简化版Qt信号槽机制(2):增加内存安全保障之后感觉还不够过瘾,Qt中的QObject体系里还有不少功能特性没有实现。为了提高QObject的还原度,今天我们将父子关系、属性系统等功能也一并实现。接口设计首先,我们设计一下我们的接口。Qt的QObject类过于重,有的时候只用到部分功能的时候没必要引入额外的成员变量。因此我们将父子关系、属性系统这两部分单独抽离成为新的类。综合考虑下来,我们把支持静态、动态反射,信号槽的类改名为CObj原创 2024-07-01 15:41:52 · 887 阅读 · 0 评论 -
C++实现简化版Qt信号槽机制(2):增加内存安全保障
在上一篇文章中《C++实现一个简单的Qt信号槽机制》,我们基于前面的反射代码实现了信号槽的功能。但是上一篇的代码中没有对象生命周期管理的机制,如果在对象的生命周期结束后还存在未断开的信号和槽连接,那么信号触发时可能会尝试访问已经被析构的对象,从而引发内存访问异常。方案的确定在Qt框架中,QObject的析构函数,在对象销毁时会自动断开所有信号和槽的连接。从而避免出现这种情况。笔者考虑了一下,没有采取这种方案,因为:这会要求信号和槽两个对象互相存储双方的连接情况,在一定程度上浪费了内存。另一方面原创 2024-06-28 10:45:59 · 1553 阅读 · 0 评论 -
C++实现一个简单的Qt信号槽机制(1)
昨天写这个文章《深入探讨C++的高级反射机制(2):写个能用的反射库》的时候就在想,是不是也能在这套反射逻辑的基础上,实现一个类似Qt的信号槽机制?Qt信号槽机制简介所谓的Qt的信号槽(Signals and Slots)机制,是Qt框架中实现对象之间通信的一种方式。这是一个事件驱动程序中常见的设计模式。信号槽机制允许创建响应特定事件(如用户交互、数据变化等)的可重用组件。信号槽主要有以下核心概念组成:信号(Signals)信号是一个类成员函数的声明,它在类内部以 signals: 关键词标识。当原创 2024-06-27 16:23:33 · 1361 阅读 · 0 评论 -
探究Qt5【元对象编译器,moc】的 设计原理和技术细节
Qt5是一个跨平台C++框架,它有个突出的特点就是其元对象系统,该系统通过扩展C++的能力,为事件处理提供了信号与槽机制、为对象内省提供了属性系统,。为了支持这些特性,Qt引入了元对象编译器(moc),这用于解析C++头文件并生成附加的源代码,并与其他代码一起编译,实现元对象系统的功能。Qt的元对象编译器是Qt中相对复杂的一个部分,因此本文深入moc的技术细节,为你揭开Qt元对象系统神秘的面纱。原创 2024-06-25 11:50:48 · 1635 阅读 · 0 评论 -
在Qt中,直接include <moc_xxxxx.cpp> 为什么不会出现符号冲突的错误?
qmake 负责处理这个场景的编译问题。出于好奇也对比了这两个文件的内容,对比了moc_XXCardObjBase.cpp与2FELSIXJDY/moc_XXCardObjBase.cpp两个文件,发现其内容几乎一模一样,只有头文件的include路径变了。这个过程中,注意到XXX_autogen\include_Debug下新生成了moc_XXCardObjBase.cpp,这个文件和之前生成的moc_XXCardObjBase.cpp.d目录不一样,之前生成的在2FELSIXJDY子目录下。原创 2024-06-25 11:17:29 · 652 阅读 · 0 评论 -
运行时库链接方式实践指南(MT、MD、MTd、MDd)
通过本文系统性的介绍,相信你对运行时库的概念、特点。一致性的重要性有了更深的认识。原创 2024-06-24 10:29:27 · 2736 阅读 · 0 评论 -
Qt底层原理:深入解析QWidget的绘制技术细节(2)
在传统的C++图形界面框架中,例如DUILib等,控件的绘制逻辑往往直接在控件的类的内部,例如PushButton的draw/paint的函数内部,Qt的QWidget费了老大劲,定义了一堆枚举和基类,把大部分的绘制逻辑都抽离了具体的类,转到了QStyle上。这种做法说实话,是有弊有利的。原创 2024-06-19 11:29:10 · 1227 阅读 · 2 评论 -
Qt底层原理:深入解析QWidget的绘制技术细节(1)
在Qt5中,QWidget的绘制流程比较分散,网上介绍的文章也很少,因此写一篇文章总结记录一下这部分的知识点。原创 2024-06-19 11:27:46 · 3011 阅读 · 0 评论 -
深入浅出 Qt 中 QListView 的设计思想,并掌握大规模、高性能列表的实现方法
在这个示例中,我们将直接从派生一个模型类,而不是使用addItem构造大量的ItemData。这样,我们就无需存储这些数据。这个方法在处理具有可预知数据模式的大量数据时特别有用,因为它避免了冗余的数据存储和内存开销。首先,我们定义一个类,它继承自。Q_OBJECTpublic:// 在顶层,返回项的数量;否则返回0,因为这是一个列表,没有子项// 根据行号动态生成数据return QString("项目 %1").arg(index.row());// 可以根据需要添加其他角色的处理。原创 2024-06-11 15:58:24 · 3207 阅读 · 1 评论