槽函数和普通的C++成员函数几乎一样,可以是虚函数,可以被重载,也可以是公有、保护或者私有的,也可以直接被其他成员函数调用,唯一与一般的成员函数不同的地方是可以与信号连接一起。
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
一般调用方式:QObject::connect(sender, SIGNAL(signal), receiver, SLOT(slot));或者QObject::connect(sender, SIGNAL(signal1), receiver, SIGNAL(signal2));其中signal、slot是带有形参数据类型的函数名;
一个信号可以连接多个槽
多个信号可以连接同一个槽
一个信号可以有另一个信号相连接
要信号成功连接槽或者另一个信号,必须保证signal和slot/signal的参数具有相同的顺序和相同的类型或者信号的参数比连接的槽函数(或者信号)的参数多,多余的参数会被忽略掉,如果连接错误,编译输出会给出警告。
默认情况下connect的第五个参数 Qt::ConnectionType type默认为Qt::AutoConnection,下面是他可能的值;
Qt::AutoConnection:如果receiver和sender同一个线程,它就等同于Qt::DirectConnection,如果receiver和sender不是同一个线程,它等同于Qt::QueuedConnection;
Qt::DirectConnection:当抛出信号时,槽函数在sender所在的线程执行立即执行;
Qt::QueuedConnection:当抛出信号时,信号被包装成了事件event,丢到receiver所在线程的事消息队列中,槽函数等到消息触发就在receiver所在线程执行。
Qt::BlockingQueuedConnection:抛信号的线程会被一直阻塞知道槽函数执行完。如果receiver和sender同一个线程,则不能使用此连接,否则应用程序将死锁。
连接也可以被移除disconnect
一般情况下,对象被delete掉了,连接就自动被移除了。
注意同一个信号和同一个槽连接n次,每次信号被抛出后,槽函数就执行n次!