应用场景如下:
举一个例子,大家知道qt自带的点击信号是无参的,有也只是bool类型,比如我要实现上图逻辑,因为从信号的传回的参数无法让我确定是哪一个按钮按了下去,我是不是应该去定义5个槽函数,并且让这五个按钮的信号分别绑定这五个槽函数,来实现我们的业务逻辑。
//例如这样:
connect(btn1,SIGNAL(clicked()),this,SLOT(getText1()));
connect(btn2,SIGNAL(clicked()),this,SLOT(getText2()));
connect(btn3,SIGNAL(clicked()),this,SLOT(getText3()));
connect(btn4,SIGNAL(clicked()),this,SLOT(getText4()));
connect(btn5,SIGNAL(clicked()),this,SLOT(getText5()));
//然后再去实现getText1,getText2,getText3,getText4,getText5
其实五个槽函数里面的业务逻辑,只是输出对于的人名,可以说是一个业务逻辑,现在却需要五个函数,函数的作用就是为了解重复代码,很明显现在我们现在没有简洁代码,反而是反其道而行,那么如何去改善这一写法呢,往下看。
主要的矛盾就在于我们无非是想让槽函数有一个参数,用来辨别是哪一个按钮被点击了,但是按钮自带的信号没有这个参数,就算我们强行给槽函数搞一个参数,信号也不会给我们这个参数,并且也不会成功编译,qt的槽信号机制,信号和槽的参数要对应。
那么有没有一个能充当中间人的角色呢?有
QSignalMapper这个类可以帮我们做到,它将来自于一些有标识的发送者的signal连接在一起。
该类收集一组无参的signal,然后以整型数、或字符串、或widget参数为参数重新将这些signal再次发送出去,而这里的整型数、字符串和widget参数就是原本发送该signal对象的标识信息。
说白了就是转发器,怎么用,让我们来一起看一下
QSignalMapper * myMapper;
myMapper = new QSignalMapper(this);
QPushButton * button[8]={ ui->pushButton_1,ui->pushButton_2,ui->pushButton_3,ui->pushButton_4,
ui->pushButton_5};
for(int i = 0;i<5;i++)
{
connect(button[i], SIGNAL(clicked(bool)), myMapper, SLOT(map()));//这个map()是QSignalMapper类的槽函数,不需要我们定义
myMapper->setMapping(button[i], i);//这个i就是我们传给槽函数的值,可以是字符串,其他等等,判断五个按钮,使用整行就可以了。
}
connect(myMapper, SIGNAL(mapped(int)), this, SLOT(getText(int)));
//然后我们编写getText(int)这个槽函数即可
void MainWindow::setPushButton(int index)
{
switch(index)
{
case0:
//业务逻辑
break;
case1:
//业务逻辑
break;
case2:
//业务逻辑
break;
case3:
//业务逻辑
break;
case4:
//业务逻辑
break;
}
}
这样是不是简单了许多!