QT信号槽使用时机

qt的信号槽机制是其一大特色,同时兼具线程安全的特点,在多线程编程方面,有着不错的表现.

但是在编写大的应用时,如果大量使用信号槽,会发现整个程序的结构就不那么美观了,就类似与在程序里面使用了大量goto语句,整个逻辑都变得很凌乱. 个人总结信号槽得使用场景:

尽量用信号槽得场景:

1.多线程通信.利用子线程的事件循环,可以省掉线程同步信号.

2.跨多个子窗口之间通信. 采用一个单例类对象,进行信号得中转,可省去多个对象之间来回引用得问题.利用信号槽得低耦合性,实现高效得编程. 

例如:

主窗口A

子窗口1-子窗口11-子窗口111

子窗口2-子窗口21-子窗口211

这时候如果需要子窗口111与子窗口211通信,最好得方式就是通过单例类进行信号中转.即可实现快速的通信. 由于QT主线程为GUI线程,所有的窗口操作都是在一个线程中操作完成,所以如果采用默认的信号槽连接方式,后台是采用直接连接的方式,所以整个信号槽的执行是类似回调函数的方式,当发送信号之后,即开始执行槽函数,紧接着执行信号后面的语句.所以整体的通信效率也还可以.

而如果只是主窗口A与子窗口1通信,则可采用使用子窗口的成员函数直接调用.最好不要信号槽的方式.因为信号槽的实现属于运行时的方式,虽然这个时间很短,但是容易打破这个程序的逻辑.

主窗口A与子窗口11通信, 也可采用在子窗口1中采用获取子窗口11对象指针的方式调用子窗口11中的成员函数. 减少信号槽的使用. 

如果是子窗口1想与主窗口A通信, 这时候就可以采用信号槽,在主窗口中将子窗口1的信号与主窗口中的槽函数绑定即可, 为什么这个时候用信号槽呢, 因为如果也采用调用成员函数的方式, 那就必须将子窗口中获取的主窗口指针强制转换为主窗口对象指针,才能调用主窗口的成员函数.这样在子窗口类中就必须包含主窗口A的头文件才能进行转换,有点麻烦.所以建议采用信号槽的方式.

总结:

虽然信号槽可以降低各个对象之间的耦合性,但同时也带来了对象之间逻辑的跳转的突然性, 当系统庞杂时,这种逻辑的来回跳转带来的是系统的繁杂. 特别像GUI中,都是在一个主线程中操作,对于各窗口对象之间的低耦合性,其实也就不是很有需要.本身每个窗口之间都是相互关联的, 父子对象的析构方式就决定了GUI窗口之间高度关联的产生. 所以在GUI之间的操作,能省去信号槽时,尽量省去.

           

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值