QT多个按钮信号绑定一个槽函数,执行不同业务逻辑。

2022-01-11 16:12:53 浏览数 (1)

应用场景如下:

举一个例子,大家知道qt自带的点击信号是无参的,有也只是bool类型,比如我要实现上图逻辑,因为从信号的传回的参数无法让我确定是哪一个按钮按了下去,我是不是应该去定义5个槽函数,并且让这五个按钮的信号分别绑定这五个槽函数,来实现我们的业务逻辑。

代码语言:javascript复制
	//例如这样:
    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对象的标识信息。

说白了就是转发器,怎么用,让我们来一起看一下

代码语言:javascript复制
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;
	}
}

这样是不是简单了许多!

0 人点赞