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