简介
信号与槽是Qt中不同对象之间进行通信的一种机制,是Qt最重核心的特性,它独立于GUI的事件循环。
信号被发射,与之连接的槽或者其他信号会被依次“执行”或发射(信号发射后是否立即返回取决于QObject::connect()
的type
参数,除Qt::QueuedConnection
以外其余的连接方式都会在信号被发射后阻塞,直到所有槽执行返回)。
特性
- 信号与槽机制是类型安全的:
- 信号与槽的函数参数一致,而且允许槽函数的参数少于信号,多余的参数被舍弃;
- 如果使用函数指针的形式,在编译器可以完成检查,如果使用宏形式,需要在运行时完成检查。
- 信号与槽是松耦合的:
- 信号的发射无需关注是否有槽函数接收;
- 一个信号可以连接多个槽,也可以多个信号连接一个槽,甚至可以将信号与另一个信号连接。
使用
- 继承于
QObject
或其子类 - 在类的头部声明
Q_OBJECT
宏 - 信号声明在
public
区域,无需返回值,无需定义,用signals:
标明 - 槽函数的用
<access level> slots:
标明,可以定义在不同的访问区域,与普通函数唯一不同的地方在于它可以连接在信号上,当被用作槽的时候,可以无视访问权限 - 通过
QObject::connect()
方法连接信号与槽,在合适的时机执行emit <your signals>
发射信号 QObject:connect()
有多个重载形式,可以使用函数指针或者SIGNAL
和SLOT
宏,后者需要标明参数类型,但是不可以带参数名
性能
通过信号与槽机制执行槽函数要慢于直接执行槽函数,大约相差10倍(对于非虚函数),仅涉及函数调用的开销,通常来说,函数实际执行过程中的开销远大于调用的开销,因此这部分性能丢失与信号与槽带来的灵活与便捷相比完全可以忽略。
默认值参数
- 信号与槽同样允许使用默认值参数,如果使用函数指针方式,与之前没有区别;
- 使用
SIGNAL
和SLOT
需要注意,默认值参数可以不写, 只要保证信号的参数与槽的参数匹配