Qt信号与槽
介绍
信号与槽是Qt的核心特性,是对象间通信所采用的机制。
其是由Qt的元对象系统支持而实现的,所以要使用信号与槽机制须添加Q_OBJECT
宏。
信号(signal)是在特定情况下被发射的通知。
槽(slot)是对信号进行响应的的函数。其为函数,可以正常被调用。与一般函数不同的是其可以通过**connect()**与信号关联,当信号被发射时会运行与之关联的槽函数。
关联信号与槽
信号与槽使用connect()进行关联。其为QObject的静态函数,格式如下:connect(发送对象, &信号指针, 接收对象, &槽函数指针);
Qt还提供了SIGNAL与SLOT两个宏用来更方便的指明信号与槽函数,因此connect()也可以写成以下形式:connect(发送对象, SIGNAL(信号), 接收对象, SLOT(槽));
对于connect()的使用还有以下规则:
- 一个信号可以连接多个槽函数,其会按照建立连接时的顺序依次执行。
- 多个信号可以连接同一槽函数。
- 一个信号可以连接另个信号。
- 信号与槽的数个参数类型需一致,信号参数不得少于槽的参数。
- 当信号被发射,与之关联的槽函数通常被立即运行,只有槽函数运行完毕后之后的代码才能运行。
解除关联
disconnect()用于解除关联,其有如下几种使用方式:
解除一个发射者的所有信号连接
1 | //静态函数形式 |
解除一个发射者特定信号的所有连接
1 | //静态函数形式 |
解除与一个接收者所有信号的连接
1 | //静态函数形式 |
解除特定的连接disconnect(发送者,(SIGNAL(信号),接收者,SLOT(槽))
获取信号发送者
在槽函数中可以调用sender()来获取信号发送者的QObject对象指针。
若知道其确切的类型可以使用qobject_cast<T*>(sender())
来获取其类型的指针。
自定义信号发送
在自己设计的类中可以自定义信号。
在类的signals部分中定义信号。
1 | class{ |
信号函数是无返回值的,但有输入参数。
信号函数无需实现,只需要在特定情况下被发射。
在需要发射信号时使用emit关键字。
1 | //发射信号 |
参考资料
Qt6 c++开发指南 人民邮电出版社