Qt信号和槽实际上就是23种设计模式中的观察者模式;当某个事件发生了就会发出信号,处理信号和自己的函数称为槽绑定来处理这个信号;信号的本质就是事件;
通过Qobject::connect函数连接信号和槽对应的对象,该函数是一个回调函数并被注册到Qt中;
信号和槽的优点:类型安全,松散耦合;一个类型若要支持信号和槽,则必须从QObject或QObject的子类继承,信号和槽机制不支持对模板的使用;
信号和槽机制增强了对象之间通信的灵活性,通常传递一个信号来调用槽函数会比直接调用非虚函数运行速度慢十倍左右,其原因:
1)多线程的情况下,信号需要排队等待;
2)编组和解组传递参数;
3)安全的遍历所有关联;
4)需要定位接受信号的对象;
Qt信号和槽第5个参数、
enum ConnectionType { AutoConnection, DirectConnection, QueuedConnection, BlockingQueuedConnection, UniqueConnection = 0x80 };
1)自动连接(AutoConnection),默认的连接方式,如果信号与槽,也就是发送者与接受者在同一线程,等同于直接连接;如果发送者与接受者处在不同线程,等同于队列连接;
2)直接连接(DirectConnection),当信号发射时,槽函数立即直接调用。无论槽函数所属对象在哪个线程,槽函数总在发送者所在线程执行,即槽函数和信号发送者在同一线程;
3)队列连接(QueuedConnection),当控制权回到接受者所在线程的事件循环时,槽函数被调用。槽函数在接受者所在线程执行,即槽函数与信号接受者在同一线程;
4)锁定队列连接(BlockingQueuedConnection),槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个;
5)单一连接(UniqueConnection),这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接;