干货2-信号与槽-1.Qt信号与槽机制原理(Signal&Slot)

237 阅读2分钟

1.信号

所谓信号槽,信号本质是事件。

2.槽

就是对信号相应的函数,槽就是一个函数。

重要

1.信号与槽关联是使用QObject::connect()函数进行实现

2.槽函数可以使用public slots/protected slots/private slots修饰

3.信号函数只需要声明,而槽函数需要实现

4.信号与槽机制底层是通过函数之间进行相互调用实现的。

5.每个信号都可以用函数来表示,称为信号函数。每个槽也可以用函数来表示,称为槽函数。

6.signalsslots是Qt开发中再c++语言基础之上扩展的关键词,专门用于指明信号函数和槽函数

image.png

3.信号与槽机制连接方式

3.1 信号与槽机制概念

QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::Connection Type type = Qt::AutoConnection)

参数1sender:发出信号的对象

参数2signal:sender对象的信号

参数3receiver:信号接收者

参数4method:receiver对象的槽函数,当检测到sender信号,receiver对象调用method方法

3.2 一个信号可以跟另一个信号相连

conect(object1,SIGNAL(signal1),object2,SIGNAL(signal1));

3.3 同一个信号可以跟多个槽相连

conect(object1,SIGNAL(signal1),object2,SIGNAL(slot2));
conect(object1,SIGNAL(signal1),object3,SIGNAL(slot1));

3.4 同一个槽可以响应多个信号

conect(object1,SIGNAL(signal2),object2,SIGNAL(slot2));
conect(object3,SIGNAL(signal2),object2,SIGNAL(slot2));

3.5 常见连接方案

conect(object1,SIGNAL(signal),object2,SLOT(slot));

4.信号与槽机制优势

1.松散耦合

2.类型安全

3.一个类若要支持信号和槽,就必须QObject或QObject的子类继承,Qt信号和槽机制不支持对模块的使用

5.信号与槽机制效率

增强对象之间通信的灵活性,但是也会损失一些性能。通过传递一个信号来调用槽函数将会比直接调用非虚函数运行速度慢

1.多线程的时候,信号需要排队等待

2.编组/解组传递的参数

3.安全地遍历所有的关联

4.需要定位接收信号的对象