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

应用场景如下:

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

这样是不是简单了许多!

可以使用Qt信号机制来实现这个功能。假设有两个按钮btn1和btn2,以及一个函数btnClicked(),可以按照以下步骤来实现: 1. 在Qt信号连接函数connect()中,将btn1和btn2的clicked()信号连接到btnClicked()函数: ```cpp connect(btn1, &QPushButton::clicked, this, &MyClass::btnClicked); connect(btn2, &QPushButton::clicked, this, &MyClass::btnClicked); ``` 其中,MyClass是当前类的名字,也可以直接写this。 2. 实现btnClicked()函数,根据sender()函数获取信号源,即点击的按钮,进行相应的处理: ```cpp void MyClass::btnClicked() { QPushButton *btn = qobject_cast<QPushButton *>(sender()); if (btn == btn1) { // btn1 clicked } else if (btn == btn2) { // btn2 clicked } } ``` 以上代码中,qobject_cast<QPushButton *>(sender())可以将sender()函数返回的QObject对象转换为QPushButton对象,方便判断哪个按钮被点击了。根据需要,可以在if和else if语句中添加相应的处理代码。 完整的代码示例如下: ```cpp #include <QPushButton> class MyClass : public QObject { Q_OBJECT public: MyClass(QObject *parent = nullptr) : QObject(parent) {} private slots: void btnClicked(); private: QPushButton *btn1; QPushButton *btn2; }; void MyClass::btnClicked() { QPushButton *btn = qobject_cast<QPushButton *>(sender()); if (btn == btn1) { // btn1 clicked } else if (btn == btn2) { // btn2 clicked } } int main(int argc, char *argv[]) { QApplication app(argc, argv); MyClass obj; QPushButton btn1("Button 1"); QPushButton btn2("Button 2"); obj.btn1 = &btn1; obj.btn2 = &btn2; QObject::connect(&btn1, &QPushButton::clicked, &obj, &MyClass::btnClicked); QObject::connect(&btn2, &QPushButton::clicked, &obj, &MyClass::btnClicked); btn1.show(); btn2.show(); return app.exec(); } ``` 注意:在使用Qt信号机制时,需要在类的声明中添加Q_OBJECT宏,才能使用自定义的函数
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花狗Fdog

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值