初探Qt4信号槽使用

Posted on 2010-01-22 21:33  liuyanghejerry  阅读(1904)  评论(0编辑  收藏  举报

接触Qt好几天了,发现Qt在中文资料方面还是比较少的,多是在翻译那一本《Programming with Qt4》,想参考多些例程都不大方便。

 

这里写下个人的学习感悟,供后来者参考以及自己复习。

 

1、Qt4的信号槽是一个函数“并发”便捷装置。

 Qt4的信号槽乍一看很像是C++ Builder当中或者VB当中双击一个控件产生事件的装置。相同点在于这两种都是“触发一个,就会触发另一个”。

 

2、信号槽中的两个函数没有“承接”关系。

这一点我曾经犯迷糊,认为信号函数发动了槽函数并给槽函数提供了参数,最终槽函数又把返回值提供给信号函数,但实际上这是一个大误区。

两个函数实际上根本就不承接,只是在触发一个时必定触发另一个。换句话说,两个函数的触发被Qt实现了同步(近似吧),但信号函数不会给槽函数传递任何值,槽函数也不会给信号函数返回任何值。

 

3、信号槽当中的参数、返回值问题。

尽管信号函数和槽函数相互不传递任何值,但二者所接受到的参数必须一样。当信号函数被触发时,如果接受到了任何参数,那么这个参数也会传递给槽函数。当信号函数没有任何参数时,槽函数也不会接收到任何参数。所以说二者在参数上必须保持一致。

不过信号函数的参数却可以多于槽函数,槽函数会直接无视多于的参数。

而至于返回值,信号的返回值是可以被调用者成功接收到的,而槽的返回值则会被完全无视掉。

 

4、不要过分依赖信号槽。

尽管看起来信号槽制度可以实现函数并发给人的感觉非常好,但实际上有些地方并不适合常用。

比如,如果有很多个按钮,都有各自的clicked(),如果我们用信号槽来对这些cliked()进行反映,那么我们就必须也拥有相同多个槽函数来承接。因为clicked()是没有任何一个参数来表示自己究竟是哪个按钮的,那么槽函数也就无法接收到一个能够知道究竟是哪个按钮被按下的参数。

请看如下代码:

 1 QObject::connect(ui->pushButton_2,SIGNAL(clicked()),

2             this,SLOT(ItIsClicked()));//ItIsClicked()函数收不到任何参数来告诉他究竟是哪个按钮被按下,所以他就必须成为“定制”的函数,从而失去了通用性

 

当然,如果按钮真的很多的话,可以有一种方法来解决(貌似是用一个map),不过我还没学会XD而且这也不属于通用解决方案了。

Copyright © 2024 liuyanghejerry
Powered by .NET 8.0 on Kubernetes