信号和槽主要用于组件之间的通信,类似于.net和java中的委托。
使用QObject::connect方法将信号与槽关联起来,然后信号的发起者发出信号,接受者中的槽函数就会执行。
比如connect(this,SIGNAL(start()),worker,SLOT(Start())),将当前类中start信号关联到worker对象的Start函数,当我们调用emit this->start()时就发出信号,槽函数就会收到这个信号。
connect函数还有第五个参数,这个参数决定信号何时传给槽,这里提一下,不过本人目前一直使用的默认值。
Qt::AutoConnection,默认值自动连接,当信号发起者与槽函数执行者在同一线程时,就会使用Qt::DirectConnection,反之则使用Qt::QueuedConnection。
Qt::DirectConnection,直接相连,信号一发起槽函数立马执行,信号发起者与执行者在同一线程。
Qt::QueuedConnection,队列式,信号发起者与执行者不在同一个线程,信号发起时,槽函数会等待调度。
Qt::BlockingQueuedConnection,跟Qt::QueuedConnection一样,不同的是信号发起时存在互斥锁,要等待槽函数返回,这样如果槽函数与信号函数在同一个线程中就会发生死锁(也就是一直堵在锁的位置,没法进入槽函数)。
Qt::UniqueConnection,这个通过“或”跟上面的一起使用,表示同样的connection只能连接一次,好像没啥作用了,对象、信号、槽相同的connection多次连接会失败。
信号与槽要想断开连接,使用QObject::disconnect方法。
关于信号和槽的使用也就这么多,但是经常用,特别是在多线程里面,遇上槽函数没执行可能是连接写错了或是槽函数所在线程哪里堵住了(比如死循环之类的)。