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

发布时间 2023-04-12 18:15:40作者: 青衣守旧人

界面如果包含多个按钮,每个按钮都创建一个槽函数,这样会这代码看起来比较冗杂,我们可以让多个按钮共用一个槽函数,然后去执行不同的功能。

一、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;
    }
}