QT信号和槽的实现原理

信号和槽是qt用于对象之间通信的核心机制。其目的类似于当一个动作发生的时候,需要对这个动作做出相应的处理,类似的还有借助于函数指针的回调机制,通过回调函数完成对此动作的操作。但是如果对一个庞杂的系统,这种回调函数的维护是相当的麻烦和危险的,使用太多的回调会导致高耦合的情况,这在实际开发过程中是尽量避免的。QT的信号和槽机制避免了该问题,使用起来非常灵活。

使用信号与槽,首先,类必须直接或间接继承自QObject,在类入口处使用O_OBJECT宏,这是必须的,因为必须是信号槽机制由元对象系统(meta object system)提供。

信号:signals或Q_SIGNALS声明的函数,可以看作是一个请求或者一个动作的标志。如果一个对象在达到一个状态或者需要一个请求等操作的时候,其会触发这个信号。qt实现触发请求,使用emit命令(emit 信号函数)。

信号通常是没有返回值的,项目开发中一般都是void,函数中根据情况声明对应的参数列表,该函数只需要声明。

槽:slots或Q_SLOTS关键字声明,槽函数其实就是一个普通的函数,槽函数里边的参数列表应该跟绑定的信号函数参数列表(参数类型和个数)一致,当然参数个数可以比信号少,多余的信号函数参数被忽略了,注意,参数槽函数参数个数少,但是前面的顺序必须跟信号函数一致。如:

signals:

void signalsTest(int A, int B);

private:

slots:

int slotsTest(int A));

int slotsTest(int B));  //该函数不能绑定signalsTest信号。参数列表不一致

其信号槽工作的过程是:先将信号和槽函数进行绑定,当一个对象通过emit发射一个信号的时候,则和其连接的对象的槽函数进行处理,等槽函数处理完成之后emit退出并执行接下来的内容。

查找资料的时候发现有的把信号槽机制当成观察者模式来理解,开始感觉没什么问题,但是从关系的角度来说,观察者模式通常对应的关系是1对多(n)的情况,即被观察者(1)和观察者(n)。我们可以把信号当成被观察者,槽函数当成观察者,因为一个信号可以对应多个槽函数,当信号发送时绑定的槽函数都会执行,执行顺序不确定。不过信号槽机制还有多个信号对应一个槽函数的情况,以及一个信号对一个信号的情况。所以建议读者在理解的过程中注意,如果当初观察者模式时,不要只关注一个信号对应多个槽函数的情况。

参考:

https://blog.csdn.net/iEearth/article/details/74025072

猜你喜欢

转载自blog.csdn.net/yj_android_develop/article/details/83511993