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之间的操作,能省去信号槽时,尽量省去.