前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >QT多个按钮信号绑定一个槽函数,执行不同业务逻辑。

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

作者头像
花狗Fdog
发布2022-01-11 16:12:53
2.1K1
发布2022-01-11 16:12:53
举报
文章被收录于专栏:花狗在Qt

应用场景如下:

举一个例子,大家知道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;
	}
}

这样是不是简单了许多!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/02/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档