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

举报
花狗Fdog 发表于 2021/02/09 00:00:52 2021/02/09
【摘要】 应用场景如下: 举一个例子,大家知道qt自带的点击信号是无参的,有也只是bool类型,比如我要实现上图逻辑,因为从信号的传回的参数无法让我确定是哪一个按钮按了下去,我是不是应该去定义5个槽函数,并且让这五个按钮的信号分别绑定这五个槽函数,来实现我们的业务逻辑。 //例如这样: connect(btn1,SIGNAL(clicked()),this,SLOT(ge...

应用场景如下:

在这里插入图片描述
举一个例子,大家知道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


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其实五个槽函数里面的业务逻辑,只是输出对于的人名,可以说是一个业务逻辑,现在却需要五个函数,函数的作用就是为了解重复代码,很明显现在我们现在没有简洁代码,反而是反其道而行,那么如何去改善这一写法呢,往下看。

主要的矛盾就在于我们无非是想让槽函数有一个参数,用来辨别是哪一个按钮被点击了,但是按钮自带的信号没有这个参数,就算我们强行给槽函数搞一个参数,信号也不会给我们这个参数,并且也不会成功编译,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;
	}
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

这样是不是简单了许多!

文章来源: blog.csdn.net,作者:花狗Fdog,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Fdog_/article/details/113696479

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200