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

被折叠的 条评论
为什么被折叠?



