当前位置: 首页 > news >正文

【QT】信号与槽中多个按钮(pushbutton)共用一个槽函数的两种实现方式

两种方法的对比

  • 方法1:sender()

优点:代码简洁,无需额外参数
缺点:依赖运行时类型转换,安全性较低
适用场景:简单场景,少量按钮

  • 方法2:Lambda (推荐)

优点:安全直观,直接传递标识
缺点:需要为每个按钮单独连接
适用场景:现代Qt项目,推荐首选(QT5以上才支持)

注意事项:

  • 线程安全
    • 若在多线程环境中使用 sender(),需确保发送者对象未被销毁。
  • 性能优化
    • 对高频点击按钮,避免在槽函数中执行耗时操作。
  • 代码维护
    • 使用枚举代替字符串标识(如 enum ButtonType { Prev, Next, … })可提高代码健壮性。

示例代码:

// widget.h

// widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void onButtonClicked();void handleButton(const QString &btnType); // 统一处理函数private:Ui::Widget *ui;
};
#endif // WIDGET_H

// widget.cpp

// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 方法1:使用 sender() 函数识别信号源// 方法1.步骤1:统一连接按钮的 clicked 信号到槽connect(ui->btn1, &QPushButton::clicked, this, &Widget::onButtonClicked);connect(ui->btn2, &QPushButton::clicked, this, &Widget::onButtonClicked);connect(ui->btn3, &QPushButton::clicked, this, &Widget::onButtonClicked);// 方法2:Lambda 表达式传递按钮标识// 方法2:步骤1:连接信号时通过Lambda捕获按钮对象connect(ui->btn1, &QPushButton::clicked, [this]() { handleButton("prev"); });connect(ui->btn2, &QPushButton::clicked, [this]() { handleButton("next"); });connect(ui->btn3, &QPushButton::clicked, [this]() { handleButton("forecast"); });
}Widget::~Widget()
{delete ui;
}// 方法1:步骤2:在槽函数中通过 sender() 判断来源
void Widget::onButtonClicked()
{
#if 1QString objName = sender()->objectName();if (objName == "btn1") {qDebug() << "方法1-btn1被点击";} else if (objName == "btn2") {qDebug() << "方法1-btn2被点击";} else if (objName == "btn3") {qDebug() << "方法1-btn3被点击";}
#elseQPushButton *clickedButton = qobject_cast<QPushButton*>(sender());if (!clickedButton)return;// 根据按钮的 objectName 或指针地址区分if (clickedButton == ui->btn1) {qDebug() << "方法1-btn1被点击";} else if (clickedButton == ui->btn2) {qDebug() << "方法1-btn2被点击";} else if (clickedButton->objectName() == "btn3") {qDebug() << "方法1-btn3被点击";}
#endif
}
// 方法2:步骤2:统一处理函数
void Widget::handleButton(const QString &btnType)
{if (btnType == "prev") {qDebug() << "方法2-btn1被点击";} else if (btnType == "next") {qDebug() << "方法2-btn2被点击";} else if (btnType == "forecast") {qDebug() << "方法2-btn3被点击";}
}

现象:

在这里插入图片描述

http://www.xdnf.cn/news/105823.html

相关文章:

  • 解决 Spring Boot + MyBatis 项目迁移到 PostgreSQL 后的数据类型不匹配问题
  • 全面解析 classification_report:评估分类模型性能的利器
  • 模型 观测者效应
  • 11、认识redis的sentinel
  • 程序员思维体操:TDD修炼手册
  • [LangGraph教程]LangGraph03——为聊天机器人添加记忆
  • 大模型评估方法与工程实践指南:从指标设计到全链路优化
  • NHANES指标推荐:CTI
  • 熊海CMS Cookie脆弱
  • MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典(一)
  • cJSON
  • 【泊松过程和指数分布】
  • Leetcode刷题记录17——三数之和
  • AIGC的商业化路径:哪些公司正在领跑赛道?
  • 2025.04.23【Treemap】树状图数据可视化指南
  • DasViewer软件显示设置
  • C# AutoResetEvent 详解
  • 2025.04.23【探索工具】| STEMNET:高效数据排序与可视化的新利器
  • windows端远程控制ubuntu运行脚本程序并转发ubuntu端脚本输出的网页
  • VTK-8.2.0源码编译(Cmake+VS2022+Qt5.12.12)
  • 数据预处理:前缀和算法详解
  • 23种设计模式-结构型模式之享元模式(Java版本)
  • Apache Flink 深度解析:流处理引擎的核心原理与生产实践指南
  • 邮件被标记为垃圾邮件怎么办
  • 安全邮件系统的Maple实现详解
  • 如何选择 Flask 和 Spring Boot
  • Python爬虫实战:获取豆ban网最新电影数据,为51观影做参考
  • 网络原理 - 6
  • 线段树讲解(小进阶)
  • 第七章:Workspace Security