QObject源码--剩余内容

QObject中主要的内容是关于信号与槽的管理方式,上一节已做了简单说明,本篇主要看下剩余的部分;

剩余的部分主要是关于对象回收机制、事件处理等内容;

1、QObject的Event事件

通过以上代码可知,QObject中主要有定时器事件,常用的定时器有QTimer,QTime等,后续会着重讲解其使用;timerEvent为虚函数,子类可以实现自定义的函数处理;

 ChildAdded、ChildPolished、ChildRemoved等事件是在其更改其parent对象时,会触发此事件;

DeferredDelete事件:当准备删除此对象时触发;

MetaCall事件:当信号和槽的链接方式为队列时,最终会定位到此事件中

ThreadChange事件:更改为不同线程时触发;

User事件:为自定义事件,如果要捕获自定义事件,可以实现customEvent函数;

EventFilter事件其在QObject实现方式为空,后续会结合QCoreApplication来讲解Qt的事件系统

2、QObject对象管理既对象回收机制:

a、添加子对象到children列表中

 

首先了解下更改QObject对象的parent时,其执行的操作;

如果原parent对象不为空,则判断其是否正在被parent移除,如果已经执行deleteChildren函数则不需要再次在parent中移除;否则在parent的children链表中移除此对象,并发送ChildRemoved事件;

判断新的parent对象和当前对象是否为同一线程,如果不在同一个线程在抛出警告信息,并返回(如果不在同一个线程,则QObject对象内存无法自动被回收,需要手动删除);

将当前对象添加到新的parent对象的children链表中,并发送ChildAdded事件;

最后判断是否需要执行parentChaned函数;parentChanged函数为钩子函数;

b、删除子对象

当QObject对象被删除时,其对应的源码为(主要在析构函数中):

首先删除其子对象,既移除children链表中的对象;如果父对象不为空,将父对象设为空;

 首先检测isDeletingChildren是否为true,如果为true,则触发断言;防止子对象被多次删除;

遍历children列表,将currentChildBeingDeleted赋值,更改children[i]为空,删除currentChildBeingDeleted对象;最后将children链表清空,更改对象的标志位;

注意:此地方先调用children[i]取出带删除的对象,然后将children[i]赋值为0,再删除此在对象;这样做应该是防止待删除对象执行其析构函数时消耗时间太长,而此时又执行了setParent方法时会引起异常(删除的对象又再次被添加到其他对象的children列表中,可以结合setParent方法理解)。

c、查找子对象

查找对象一般又2种方式,一种是查找一个对象,一种是查找所有相符的对象列表

 ​​​​​​  查找相符合的一个对象

首先移除T对象的const、volatile、*等关键字,提取对象的原始类型;然后调用qt_qFindChild_helper函数。

 遍历children列表,查找子对象中和T对象有继承关系的对象,且name为空或者和objectName相匹配时,既返回当前对象;如果再当前children列表中没有找到,且option为递归查找,则在子对象中查找。

qt_qFindChildren_helper函数

遍历children列表,查找子对象中是否和当前对象相匹配,如果相符,则添加到list列表中;

3、QTimer相关事件处理

启动定时器,主要调用eventDispatcher对象,注册一个定时器事件,并保存对应的定时器id到runningTimers中;

 停止定时器,主要是调用事件分发器的unregisterTimer函数,并在runningTimers中移除对应的定时器;

后续分析QEventDispatcher函数时,会具体查看registerTimer及unRegisterTimer函数,猜测是调用windows及unix系统的api实现定时器事件的分发;

4、moveToThread函数

moveToThread函数主要有:1、遍历所有子对象并发送线程改变事件;2、将当前postEventList中待分发的事件转移到新的线程中;3、更改当前信号槽列表,将其存储的threadData信息调整为目标threadData;主要在setThreadData_helper中实现如下:

 上图1:转移event事件到新的线程中

上图2:如果作为信号发送者,清空所有的信号接收者

上图3:如果作为信号接收者,调整发送信号对象中存储的线程信息(将threadData信息更改为目标线程信息)

最后循环遍历所有的子对象,并调整线程信息;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt QObjectQt 库中的一个基础类。它是所有 Qt 对象的基类,提供了许多基本的对象管理功能,包括内存管理、事件通信、信号和槽机制以及属性系统。 使用 QObject 的子类可以很容易地在应用程序中实现事件驱动的行为,并且可以利用 Qt 的信号和槽机制在对象之间进行通信。 例如,可以使用 QObject::connect 函数来连接一个对象的信号到另一个对象的槽函数,从而在信号发出时调用槽函数。这种机制可以让你很容易地在应用程序中实现事件驱动的行为,并且可以使用 Qt 的信号和槽机制在对象之间进行通信。 ### 回答2: Qt是一种跨平台的C++开发框架,用于构建图形界面和应用程序。QObjectQt框架中的一个核心类,用于实现对象的即时信号和槽机制。 QObject提供了各种功能,例如对象的属性系统、线程支持、对象的生命周期管理等。在Qt中,所有类都继承自QObject或者其子类,以获得这些功能。 QObject的一个重要特性是信号和槽机制。信号和槽机制是一种对象间通信的方式,通过信号实现对象的某个事件的触发,然后通过槽函数来处理事件。信号和槽机制可以实现耦合度低、灵活性高的对象间通信,非常方便。 此外,QObject还有一个属性系统,用于管理对象的属性。属性可以是对象的状态或配置信息,可以通过属性系统实现对属性的读取和修改。属性系统提供了一种方便的方式来处理对象的状态变化或界面显示问题。 另外,QObject提供了对对象生命周期的管理。Qt中的对象可以是直接由new操作符动态创建的,也可以是作为父对象的子对象。当父对象删除时,它会自动删除其所有子对象,以避免内存泄漏问题。 总而言之,QObjectQt框架中非常重要的一个类,提供了诸多功能,例如信号和槽机制、属性系统、对象生命周期管理等。它使得Qt开发更加方便和高效,极大地简化了开发人员的工作。 ### 回答3: Qt中的QObject是一个基类,用于构建具有对象管理和信号槽机制的应用程序。 QObject提供了一些重要的特性,使得Qt应用程序开发更加方便和灵活。首先,QObject提供了对象树的构造和管理能力。通过将QObject对象组织成树状结构,可以轻松地管理应用程序中的对象,包括对象的创建、销毁和层次关系等。这种对象树的管理机制使得QObject更适合构建大型复杂的应用程序。 QObject还提供了信号槽机制,用于实现对象之间的通信和交互。信号槽机制基于事件驱动的方式,当对象的某个状态发生变化或者执行某个操作时,会发出一个信号。其他对象可以通过连接到这个信号的槽函数来接收和处理这个信号。这种松耦合的通信方式使得应用程序的组件之间能够相互独立,易于维护和扩展。 QObject还提供了一些其他功能,包括动态属性的支持、线程安全的信号槽连接、对象的元对象信息等。动态属性功能允许在运行时为QObject对象添加自定义的属性,并且可以通过属性更改通知信号和属性读写方法进行访问。线程安全的信号槽连接确保多线程环境下信号槽的安全性和正确性。元对象信息允许在运行时获取对象的类型信息,包括类名、成员变量、方法等。 总之,Qt中的QObject是一个重要的基类,提供了对象管理和信号槽机制等核心功能,使得Qt应用程序开发更加简洁、灵活和可维护。它的使用可以大大提高应用程序的开发效率和代码质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值