目录
信号与槽的概念:实现对象与对象之间的通信。
当一个对象发生了改变会发送一个信号通知另一个对象执行一个函数,这个函数被称为槽。
信号
声明方式:
信号的声明只能在头文件中进行,Qt的signals关键字指出进入了信号声明区,随后即可声明自己的信号。信号只用声明,不用定义。
例:
信号的发送:
用emit关键字。
例:
槽
槽的声明:
槽的声明只能在头文件中进行,Qt的slots关键字指出进入了槽声明区,随后即可声明自己的槽。槽声明后必须实现,如果只声明不实现,则会出现编译错误。
例:
槽的实现:和普通函数的实现方法一样。
槽的调用:
当槽函数关联的信号被发送时,槽函数就会被调用。
信号与槽的连接
1.连接方式
手动连接:
connect(发送信号的对象,发送的信号,接受信号的对象,接收方法,连接类型);
自动连接:
通过命名连接。
2.连接规则
(1)信号的参数可以比槽多,反之不可以。
(2)信号与槽的关系可以一对一,一对多,多对一。
(3)信号也可以与信号连接。
信号与信号连接发起方的信号参数要比接收方多。连接成功后触发接收方信号不会触发发起方信号。
(4)连接可以被删除。
(5)同一个连接可以多次绑定,触发一次信号会执行多次槽函数。
但一般不会去这么使用。
3.连接类型
(1)直连方式 DirectConnection:
槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在的线程。
(2)排队方式 QueuedConnection:
槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接受者的当前函数执行完,进入事件循环之后,槽函数才会被调用。
(3)自动方式 AutoConnection:
默认的方式,如果接收者和发送者在同一个线程,则自动使用直连方式,如果不在一个线程,则自动使用排队方式。
(4)阻塞排队方式 BlockingQueuedConnection:
槽函数的调用时机与排队方式一致,不过发送完信号后发送者所在的线程会阻塞,直到槽函数运行完。接受者和发送者绝对不能在一个线程,否则程序会死锁。
(5)唯一连接方式 UniqueConnection:
这个方式可以通过按位或(|)与以上四个结合在一起使用。当这个方式设置时,如果某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。