前言
Qt提供了信号和槽机制用于完成界面操作的响应,信号和槽机制是完成任意两个Qt对象之间的通信机制。其中,信号会在某个特定情况或动作下被触发,槽是等同于接收并处理信号的函数。当一个类被继承时,该类信号和槽也同时被继承,也可以根据需要自定义信号和槽。
一、信号与槽机制的连接方式
(1)一个信号可以与另一个信号相连
(2)同一个信号可以与多个槽相连
(3)同一个槽可以响应多个信号
但是,常用连接方式为:
connect(Object1, SIGNAL(signal), Object2, SLOT(slot));
其中,signal为对象Object1的信号,slot为对象Object2的槽;
SIGNAL()和SLOT()是Qt定义的两个宏,它们返回其参数的C语言风格的字符串(const char*),因此上面语句等同于:
connect(Object1, "signal", Object2, "slot");
二、信号与槽机制的优点
(1)类型安全。需要关联的信号和槽的参数必须是等同的,即信号的参数类型和参数个数与接收该信号的槽的参数类型和参数个数相同。不过,一个槽的参数个数是可以少于信号的参数个数的,但缺少的参数必须是信号参数的最后一个或几个参数;否则就会报错。
(2)松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道哪个对象的哪个槽需要接收它发出的信号,无需知道是否被接收到;对象的槽也无需知道那些信号关联了自己;即使关联对象在运行时被删除,应用程序也不会崩溃。
注意:一个类要支持信号和槽,必须从QObject或QObject的子类继承;Qt信号和槽机制不支持对模板的使用。
三、信号与槽机制的效率
信号与槽机制增强了对象间通信的灵活性,运行速度比直接调用非虚函数慢10倍。原因如下:
(1)需要定位接收信号的对象
(2)安全地遍历所有的关联
(3)编组(marshal)/解组(unmarshal)传递的参数
(4)在多线程时,信号可能需要排队等待
性能损失可以忽略。