Qt之信号与槽
有关这个概念网上有太多太多的资料了,这些资料也非常健全,比如下面这些文章,后两篇比较高端,现在还没完全整明白,感谢tingsking18大神
http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/
http://blog.csdn.net/tingsking18/article/details/4800828
http://blog.csdn.net/tingsking18/article/details/4991563
接下来就来谈谈自己碰到的一些注意事项,关于connect信号与槽的参数问题
1、信号与槽中的参数个数与类型必须完全一样,什么意思,看下面的代码,曾经的一个错误:
connect(button, SIGNAL(clicked()), this, SLOT(sendMessage(QString)));
本意是连接qpushbutton的clicked()信号与槽sendMessage(),其中槽有一个形参类型为QString,这样一切编译通过,可是调试的时候发现根本进不了槽函数,问题就出现在信号与槽函数的参数个数不一样。将上述代码改成connect(but, SIGNAL(clicked(QString)), this, SLOT(sendMessage(QString)));即可。注意这是Qt中的使用SIGNAL()和SLOT()的一个自身的缺陷,在编译时不会检查这种错误,只有在运行时才会在程序的输出窗口输出错误。我这里用的VS2010来调试,观察输出窗口,会发现输出了以下的错误:
QObject::connect: Incompatible sender/receiver arguments
MyButton::clickButton() --> onefloor::sendMessage(QString)
另外,参数类型必须完全一样,即信号参数为QString,槽参数也必须为QString,不能int对应QString。这就是信号与槽中的参数个数与类型必须完全一样的含义。
这个问题在Qt5中推荐使用一种更加安全的方法,下面再讨论
2、信号与槽函数中不能有形参名。还是看个错误的例子
connect(button, SIGNAL(config(QString abc)), this, SLOT(configAddr(QString str)));
还是一样,编译时不会报错,运行时在输出窗口时可以看到错误,最终的结果当然也是槽函数没有响应。
上面提到的Qt5中会推荐一种使用方法,可以避免信号与槽连接时运行时报错,不方便查找错误。
connect(obj1, &ClassA::fun1, obj2, &ClassB::fun2);
针对第一个例子,也就是写成这样connect(button, &MyButton::clickButton, this, &onefloor::sendMessage);
这样,就可以再编译的时候检查信号与槽是否存在,并进行参数类型检查。
有关Qt5中connect的说明,可以参考以下两篇博客http://blog.csdn.net/dbzhang800/article/details/6547196 和 http://www.linuxidc.com/Linux/2014-04/100581.htm