1.声明重载
以上一篇为例,继续完成重载部分,首先是声明部分
mother.h文件里声明重载的两个槽
void treat();
void treat(QString str);
daughter.h文件里声明重载的两个信号
void hungry();
void hungry(QString str);
说明:重载在信号和槽需要参数对应,必须是同类型,比如我这里的信号里有一个参数,类型是QString,那么在槽里必须也是QString类型。但是,信号的参数个数可以多于槽函数的参数个数,类型必须.
.一一对应。
2.槽函数的定义部分
mother.cpp文件里增加新的槽函数定义,我一共给了三种写法,效果在后文
void Mother::treat(QString str)
{
qDebug()<<"请女儿吃"<<str;
//QString转化为char*的方法:先转为QByteArray(通过toUtf8()),再转为char*(data())
qDebug()<<"请女儿吃"<<str.toUtf8().data();
qDebug()<<("请女儿吃"+str).toUtf8().data();
}
- 建立连接部分
由于此时函数重载,原本的connect函数并不清楚要调用哪个函数,所以需要通过函数指针选择对应的函数
void (Mother:: *mytreat)(QString)=&Mother::treat;
void (Daughter:: *myhungry)(QString)=&Daughter::hungry;
//建立连接(发送方,信号内容,接受方,信号槽)
connect(d,myhungry,m,mytreat);
在写成员函数的成员地址时,记得写上成员函数的作用域!是Mother和Daughter的函数指针!
- 触发部分
重新写一个传了参数的触发
void Widget::classisover()
{
emit d->hungry("烤肉");
}
-
效果
可以看到三种不同的结果 -
disconnect:补充断开连接的方法,继续用上一篇的例子
//断开连接(发送方,信号内容,接受方,信号槽)
disconnect(d,myhungry,m,mytreat)
- 一个信号连多个槽函数
- 多个信号可以连接同一个槽函数
- QT4的信号槽连接版本
//建立连接(发送方,SIGNAL(信号内容),接受方,SLOT(信号槽))
connect(d,SIGNAL(hungry()),m,SLOT(treat()));
优点:参数直观
缺点:类型不做检测