QT处理多按钮进行相同操作

针对多按钮的图片进行切换操作,emitcan主要是用来判断按下否,flag_magnify是用来判断窗口是否放大。

一、代码重复造成冗余

原本代码:

void son_interface_1::toggleButtonImage(QPushButton* button, bool& emitCan, const QString& noImage, const QString& yesImage)
{
    if (emitCan)
    {
        button->setStyleSheet(QString("QPushButton {"
                                      "image: url(%1);"
                                      "border: none;"  /* 没有边框 */
                                      "background: transparent;"  /* 背景透明 */
                                      "background-color: transparent;"  /* 防止背景色干扰*/
                                      "}").arg(noImage));
        emitCan = false;
    }
    else
    {
        qDebug()<<"进入点击后更改";
        button->setStyleSheet(QString("QPushButton {"
                                      "image: url(%1);"
                                      "border: none;"  /* 没有边框 */
                                      "background: transparent;"  /* 背景透明 */
                                      "background-color: transparent;"  /* 防止背景色干扰 */
                                      "}").arg(yesImage));
        emitCan = true;
    }
}

void son_interface_1::on_pushButton1_clicked()
{
    if(flag_magnify)
    {
        toggleButtonImage(ui->pushButton1, emitCan, ":/image/bigno.png", ":/image/bigyes.png");
    }
    else
    {
        toggleButtonImage(ui->pushButton1, emitCan, ":/image/no.png", ":/image/yes.png");
    }
}

void son_interface_1::on_pushButton2_clicked()
{
    if(flag_magnify)
    {
        toggleButtonImage(ui->pushButton2, emitCan_2, ":/image/bigno.png", ":/image/bigyes.png");
    }
    else
    {
        toggleButtonImage(ui->pushButton2, emitCan_2, ":/image/no.png", ":/image/yes.png");
    }
}
........
//下面还有n个相同的槽函数

二、把代码进行封装和重用

1.创建按钮容器(或数组):将所有按钮存储在一个容器中。

    bool flag_magnify=false;//用于标志是否是桌面放大
    void toggleButtonImage(QPushButton* button, bool& emitCan, const QString& noImage,const QString& yesImage,const QString& objectName);    
    std::vector<QPushButton*> buttons; // 存储所有按钮
    std::vector<bool> emitCans; // 存储每个按钮的状态
    QList<QString> buttonNames; // 新增列表以存储按钮名称
    QList<QString> spinboxNames; // 新增列表以存储按钮名称

2.统一处理点击事件:使用循环处理所有按钮的点击事件,而不是为每个按钮单独编写处理函数。获取所有的控件,并且把他们放入容器中。

    // 设置 QPushButton
    QList<QPushButton*> buttonList = findChildren<QPushButton*>();
    for (QPushButton* button1 : buttonList)
    {
        if(button1->objectName()=="pushButton"||button1->objectName()=="YES"||button1->objectName()=="save")
        {
            continue;
        }
        buttonNames.push_back(button1->objectName()); // 保存按钮对象名称
        buttons.push_back(button1);
        emitCans.push_back(false); // 初始状态为 false
        // 连接按钮点击事件到处理函数
        connect(button1, &QPushButton::clicked, this, &son_interface_1::onButtonClicked);
    }

3.使用槽函数进行分析处理

// 实现 onButtonClicked 函数
void son_interface_1::onButtonClicked()
{
    QPushButton* button = qobject_cast<QPushButton*>(sender());
    if (!button) return;

    // 在按钮数组中查找该按钮
    auto it = std::find(buttons.begin(), buttons.end(), button);
    if (it == buttons.end()) return;

    // 计算按钮在数组中的索引位置
    int index = std::distance(buttons.begin(), it);

    // 输出按钮的对象名称
    qDebug() << "按钮对象名称:" << buttonNames[index]; // 输出存储的按钮对象名称

    bool emitCan = emitCans[index];  // 使用值
    // 调用 toggleButtonImage 函数
    if (flag_magnify)
    {
        toggleButtonImage(button, emitCan, ":/image/bigno.png", ":/image/bigyes.png",buttonNames[index]);
    } else
    {
        toggleButtonImage(button, emitCan, ":/image/no.png", ":/image/yes.png",buttonNames[index]);
    }
    // 更新 emitCans 数组中的值
    emitCans[index] = emitCan;
}

4.再进行具体的操作

void son_interface_1::toggleButtonImage(QPushButton* button, bool& emitCan, const QString& noImage, const QString& yesImage,const QString& objectName)
{
    if (emitCan)
    {
        qDebug()<<objectName<<"取消";
        button->setStyleSheet(QString("QPushButton {"
                                      "image: url(%1);"
                                      "border: none;"
                                      "background: transparent;"
                                      "background-color: transparent;"
                                      "}").arg(noImage));
        emitCan = false;
    }
    else
    {
        qDebug()<<objectName<<"按下";
        button->setStyleSheet(QString("QPushButton {"
                                      "image: url(%1);"
                                      "border: none;"
                                      "background: transparent;"
                                      "background-color: transparent;"
                                      "}").arg(yesImage));
        emitCan = true;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值