QT多个按钮信号绑定同一个槽函数,执行不同业务逻辑
界面如果包含多个按钮,每个按钮都创建一个槽函数,这样会这代码看起来比较冗杂,我们可以让多个按钮共用一个槽函数,然后去执行不同的功能。
一、ObjectName
通过setObjectName()在定义button处先设置ObjectName,后在槽函数中判断按钮的名称。然后根据按钮的名称从而实现不同的功能模块
#include "main_window.h" #define CREATE_MAIN_MENU_BUTTON(button, name, x, y, w, h) \ { \ button = new QPushButton(name, this); \ button->setObjectName(name); \ button->setGeometry(x, y, w, h); \ button->setCheckable(true); \ button->setFocusPolicy(Qt::NoFocus); \ connect(button, &QPushButton::clicked, this, &MainWindow::on_btn_clicked); \ } MainWindow::MainWindow(QWidget *parent) : QWidget(parent) { this->setFixedSize(800, 500); CREATE_MAIN_MENU_BUTTON(m_btn_1, "btn1", 0, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_2, "btn2", 108, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_3, "btn3", 216, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_4, "btn4", 324, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_5, "btn5", 432, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_6, "btn6", 540, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_7, "btn7", 648, 0, 108, 72); } MainWindow::~MainWindow() { } void MainWindow::on_btn_clicked() { QPushButton* btn = static_cast<QPushButton*>(QObject::sender()); QString btn_name = btn->objectName(); if (btn_name.compare("btn1") == 0) { m_btn_1->setChecked(true); m_btn_2->setChecked(false); m_btn_3->setChecked(false); m_btn_4->setChecked(false); m_btn_5->setChecked(false); m_btn_6->setChecked(false); m_btn_7->setChecked(false); qDebug() << btn_name; } else if (btn_name.compare("btn2") == 0) { m_btn_1->setChecked(false); m_btn_2->setChecked(true); m_btn_3->setChecked(false); m_btn_4->setChecked(false); m_btn_5->setChecked(false); m_btn_6->setChecked(false); m_btn_7->setChecked(false); qDebug() << btn_name; } else if (btn_name.compare("btn3") == 0) { m_btn_1->setChecked(false); m_btn_2->setChecked(false); m_btn_3->setChecked(true); m_btn_4->setChecked(false); m_btn_5->setChecked(false); m_btn_6->setChecked(false); m_btn_7->setChecked(false); qDebug() << btn_name; } else if (btn_name.compare("btn4") == 0) { m_btn_1->setChecked(false); m_btn_2->setChecked(false); m_btn_3->setChecked(false); m_btn_4->setChecked(true); m_btn_5->setChecked(false); m_btn_6->setChecked(false); m_btn_7->setChecked(false); qDebug() << btn_name; } else if (btn_name.compare("btn5") == 0) { m_btn_1->setChecked(false); m_btn_2->setChecked(false); m_btn_3->setChecked(false); m_btn_4->setChecked(false); m_btn_5->setChecked(true); m_btn_6->setChecked(false); m_btn_7->setChecked(false); qDebug() << btn_name; } else if (btn_name.compare("btn6") == 0) { m_btn_1->setChecked(false); m_btn_2->setChecked(false); m_btn_3->setChecked(false); m_btn_4->setChecked(false); m_btn_5->setChecked(false); m_btn_6->setChecked(true); m_btn_7->setChecked(false); qDebug() << btn_name; } else if (btn_name.compare("btn7") == 0) { m_btn_1->setChecked(false); m_btn_2->setChecked(false); m_btn_3->setChecked(false); m_btn_4->setChecked(false); m_btn_5->setChecked(false); m_btn_6->setChecked(false); m_btn_7->setChecked(true); qDebug() << btn_name; } }
二、QButtonGroup
创建按钮组,并将创建的按钮放进按钮组中
#include "main_window.h" #define CREATE_MAIN_MENU_BUTTON(button, name, x, y, w, h) \ { \ button = new QPushButton(name, this); \ button->setGeometry(x, y, w, h); \ button->setCheckable(true); \ button->setFocusPolicy(Qt::NoFocus); \ } MainWindow::MainWindow(QWidget *parent) : QWidget(parent) { this->setFixedSize(800, 500); CREATE_MAIN_MENU_BUTTON(m_btn_1, "btn1", 0, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_2, "btn2", 108, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_3, "btn3", 216, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_4, "btn4", 324, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_5, "btn5", 432, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_6, "btn6", 540, 0, 108, 72); CREATE_MAIN_MENU_BUTTON(m_btn_7, "btn7", 648, 0, 108, 72); m_btn_group = new QButtonGroup(this); connect(m_btn_group, SIGNAL(buttonClicked(QAbstractButton *)), this, SLOT(on_button_group_clicked(QAbstractButton *))); m_btn_group->setExclusive(true); m_btn_group->addButton(m_btn_1); m_btn_group->addButton(m_btn_2); m_btn_group->addButton(m_btn_3); m_btn_group->addButton(m_btn_4); m_btn_group->addButton(m_btn_5); m_btn_group->addButton(m_btn_6); m_btn_group->addButton(m_btn_7); } MainWindow::~MainWindow() { } void MainWindow::on_button_group_clicked(QAbstractButton *button) { if (button == m_btn_1) { qDebug() << "btn_1"; } else if (button == m_btn_2) { qDebug() << "btn_2"; } else if (button == m_btn_3) { qDebug() << "btn_3"; } else if (button == m_btn_4) { qDebug() << "btn_4"; } else if (button == m_btn_5) { qDebug() << "btn_5"; } else if (button == m_btn_6) { qDebug() << "btn_6"; } else if (button == m_btn_7) { qDebug() << "btn_7"; } }
三.QSignalMapper
通过QSignalMapper类中setMapping()将特定的字符串或整型数对应到特定的对象上,该特定对象的signal可以被连接到QSignalMapper的map() slot,而map()会发射带参数mapped() signal,参数就是signal的特定对象的标识信息,下面的代码以整型为例,作为参数。
#include "main_window.h" #define CREATE_MAIN_MENU_BUTTON(button, name, x, y, w, h, index) \ { \ button = new QPushButton(name, this); \ button->setGeometry(x, y, w, h); \ button->setCheckable(true); \ button->setFocusPolicy(Qt::NoFocus); \ m_mapper->setMapping(button,index); \ connect(button,SIGNAL(clicked()), m_mapper, SLOT(map())); \ } MainWindow::MainWindow(QWidget *parent) : QWidget(parent) { this->setFixedSize(800, 500); m_mapper = new QSignalMapper(this); connect(m_mapper,SIGNAL(mapped(int)),this,SLOT(on_button_clicked(int))); CREATE_MAIN_MENU_BUTTON(m_btn_1, "btn1", 0, 0, 108, 72, 0); CREATE_MAIN_MENU_BUTTON(m_btn_2, "btn2", 108, 0, 108, 72, 1); CREATE_MAIN_MENU_BUTTON(m_btn_3, "btn3", 216, 0, 108, 72, 2); CREATE_MAIN_MENU_BUTTON(m_btn_4, "btn4", 324, 0, 108, 72, 3); CREATE_MAIN_MENU_BUTTON(m_btn_5, "btn5", 432, 0, 108, 72, 4); CREATE_MAIN_MENU_BUTTON(m_btn_6, "btn6", 540, 0, 108, 72, 5); CREATE_MAIN_MENU_BUTTON(m_btn_7, "btn7", 648, 0, 108, 72, 6); } MainWindow::~MainWindow() { } void MainWindow::on_button_clicked(int index) { switch (index) { case 0: qDebug() << "btn_1"; break; case 1: qDebug() << "btn_2"; break; case 2: qDebug() << "btn_3"; break; case 3: qDebug() << "btn_4"; break; case 4: qDebug() << "btn_5"; break; case 5: qDebug() << "btn_6"; break; case 6: qDebug() << "btn_7"; break; default: qDebug() << "index error"; break; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?