利用Qt进行程序开发时,有时需要信号槽来完成参数传递。带参数的信号槽在使用时,有几点需要注意的地方。
第一点:当信号与槽函数的参数数量相同时,它们参数类型要完全一致。
第二点:当信号的参数与槽函数的参数数量不同时。
1:当我们的槽函数参数比信号的参数多时,将会出现QObject::connect: Incompatible sender/receiver arguments错误。
2:当槽函数参数比信号参数少时,而且前面的参数类型一致时,从左往右数多出来的参数将会被忽视。
例如有信号
void signal_fun(int i,string s);
有槽函数
void slot_fun(int i,string s) { qDebug()<<"槽函数收到的参数为:"<<i<<s; }
链接起来
connect(this,SIGNAL(signal_fun(int,string)),this,SLOT(slot_fun(int,string)));
输入代码
emit signal_fun(123,"hello");
那么则会有输出信息:槽函数收到的参数为123 hello。
除了传递实参,还可以用来传递形参:例如
void fun(int a,string str) { emit signal_fun(a,str); }
输出的结果就是a和str所代表的参数值。
6.29补充:
槽函数和对应信号的connect应该放在这个对象被创建的文件中,而不是这个对象自身的源文件中
例如:有一个类A和他的槽函数slotA(),在另一个文件B中被创建,则他的connec应该写在B的源文件中。
class A { private slots: void slotA(); }
B.cpp void fun() { A a;//创建一个A的具体对象 connect(this,SIGNAL(signal()),a,SLOT(slotA()));//不一定要写在这个位置,但是一定要是在这个文件夹中,且connect的时间要在对象被创建之后 }
这样才能生效,因为今天晚上在应用到友元类的时候发现将connect写到A.cpp中的时候,槽函数不会被触发,特此将问题记录下来。