QT 信号槽

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linfengmove/article/details/85122801

      QT的信号槽机制用起来好用,看起来也比较清晰,随时随处可以绑定自己关系的信号,非常方便。而且提供异步,跨线程使用也很给力。在之前还想把这个机制扩展成一个专门处理任务的异步队列,实验后发现不可行,多次绑定和发出信号后内存就急剧上涨,最后分配不到内存了。但是作为普通的事件通知方式还是很好用的。

      信号可以从任何线程发出,如果绑定方式是direct那么,参函数执行跟信号发出是同一个线程,可以认为是直接调用。

      如果绑定方式是queueconnect,那就要分情况:

     1.槽函数绑定的对象和信号在同一个线程,也就是说这个对象是在当前线程生成的,那么信号就被放到了当前线程的队列中(不是直接调用), 等待当前线程去依次处理。 

     2.槽函数绑定的对象在其他线程生成,那么这个信号被放到其他线程的队列中,等待其他线程去依次处理。

     用queueconnnect模式绑定有个前提,就是接收方,也就是槽函数的执行线程必须有队列。QT的主线程肯定有队列,没有消息队列QT这套也跑不起来。自己开的线程可没有,这就需要自己显示调用QEventLoop去创建消息队列,并且循环取队列中的信号,类似Windows的消息循环,代码如下:

QEventLoop loop;
loop.exec();

另外凡是加入了信号槽的类都会根据类头文件生成一个moc文件,这个moc文件并不会带有VS工程中的stdafx.h预编译头,这个时候如果工程设置了需要预编译,那么在编译时会报错。解决办法是右键该头文件打开属性,moc.exe选项参数prepend中加入stdafx.h这个头文件就好,moc在生成对应文件时会自动把stdafx.加入。

猜你喜欢

转载自blog.csdn.net/linfengmove/article/details/85122801