一个默默耕耘的工程师…
1.信号与槽
信号函数:调用信号函数就是给外界发信号,只管发送,不需要知道谁来接收或有多少个人来接收。
槽函数:一个普遍的函数,不需要要管信号是谁发过来的。通过QObject来绑定。
一个信号可以连接多个槽,而一个槽也可以监听多个信号。
2.信号槽的原理
信号函数只需要声明,不需要定义,定义由moc程序自动实现,可以把信号函数当作一个变量来对待,调用信号函数,就是将信号写入队列中,有一个主线程,主线程会从队列中获取信号,然后进行处理并调用信号对应的绑定函数。
要注意,主线程从队列中取信号:取出一个信号,处理完之后,才会取下一个信号并进行处理。如果槽函数阻塞时间很长(譬如网络通信),会导致下一个信号不能及时被处理,界面可能会卡死。所以在槽函数中一般都不会做太长时间的操作,如果实在需要做长时间的操作,可以开一个线程来处理。
Qt提供的很多槽函数(包含控件里面的槽函数)都只能在主线程中调用或者通过信号来调用这个槽函数,而不能在其他线程直接调用这些槽函数。因为有可能消息队列中有一个事件也绑定了这个槽函数,即事件/信号来了,主线程中也可能会调用该槽函数,主线程和子线程同时调用该槽函数,程序会宕掉。
3.信号与槽的关系图
4.信号槽函数的处理主循环
这个主循环也就是整个程序的主线程,这个主线程就是整个程序的入口程序:QApplication a(argc, argv);再调用a.exec()函数进行处理信号。a.exec函数的作用:进入信号槽主循环,然后主循环会一直处于等待状态,即等待队列中接收到信号。直到调用exit()函数被调用(这里猜测,exit也是一个槽函数,用来关闭主线程的)。