QT 信号槽

26 篇文章 1 订阅

      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.加入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值