重新梳理Qt当中的重要概念

1.元对象系统,继承自QObject的类,区别于普通cpp类的核心点。如果继承自QObject,则类中就多了一个元对象成员。拥有了超能力,信号槽、反射机制、类的属性,都能过去。
2.事件循环与线程,Qt程序通过exec()启动事件循环,主线程默认有一个事件循环,其他线程默认没有事件循环,要想加上,则通过在该线程中调用exec实现。事件循环只处理在同一个线程中的事件,例如QTimer产生的定时器事件,只能在同一个线程中处理。
3.事件循环是跨线程通信的信号槽的基础。当遇到跨线程通信的需求时,Qt会把信号转化为事件,放到接受者所在的线程中的事件循环中,这样,当接受者事件循环到该信号时,才会处理该信号。这跟在同一个线程中的信号槽通信,完全不同。事件循环让线程拥有了处理事件的能力,而线程为执行事件循环提供了基础。其实就一个死循环,不断从事件队列中获取事件进行处理罢了。
4.信号槽,可以分为同步调用,异步调用。在同一个线程中时,信号槽的原理相当于观测者模式的一种实现,但是比普通的观察者模式更强大、更灵活。从机制上将,发送信号的对象,确实持有一个连接列表,连接列表中列出来接收信号的对象,然后可以通过元对象系统直接调用接收者的槽函数,这不就是观察者模式吗?不过Qt丰富了这一点,他不需要有共同的接口,也能调用,他使用的是元对象系统的调用,而不是函数指针的调用。借用了观察者模式的思想,但是比它更高级。
信号槽不是依靠函数指针实现的,他是通过元对象系统,找到槽函数列表来实现的,本质上是观察者模式,实现上也不是依赖于函数指针,而是依靠元对象索引实现的。
信号槽是一个复杂的系统,依赖于元对象系统,索引查找,和多种调用策略共同实现的。底层是依靠索引查找实现的,而不是函数指针。这就是Qt最核心的基础概念。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值