一.Qt中处理多个同类型对象共享槽函数应用场景

数字键盘按钮处理

动态生成的控件管理

工具栏按钮响应

游戏中的网格点击处理

使用时需特别注意对象生命周期管理和类型安全,现代Qt开发中更推荐使用Lambda表达式替代sender()机制。

二.示例

1.本文示例功能

   在ui界面添加5个(可以更多)button控件,然后在一个click槽函数里面响应操作,这样可以使代码更简洁,尤其是botton更多的时候。

   

2.代码:方式一  

(1).mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include <QPushButton>

#define MAX_NUM_SIZE 5

QT_BEGIN_NAMESPACE

namespace Ui {

class MainWindow;

}

QT_END_NAMESPACE

class MainWindow : public QMainWindow

{

    Q_OBJECT

public:

    MainWindow(QWidget *parent = nullptr);

    ~MainWindow();

private slots:

    void slot_multi_btn_clicked();

private:

    Ui::MainWindow *ui;

    QPushButton *btnConn[MAX_NUM_SIZE];

};

#endif // MAINWINDOW_H

(2).mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)

    : QMainWindow(parent)

    , ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    btnConn[0]=ui->pushButton;

    btnConn[1]=ui->pushButton_2;

    btnConn[2]=ui->pushButton_3;

    btnConn[3]=ui->pushButton_4;

    btnConn[4]=ui->pushButton_5;

    for (int i=0;i<MAX_NUM_SIZE;i++) {

        connect(btnConn[i],SIGNAL(clicked()),this,SLOT(slot_multi_btn_clicked()));

    }

}

MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::slot_multi_btn_clicked()

{

    int ret;

    QObject *obj = sender();

    QPushButton *btn = dynamic_cast<QPushButton *>(obj);

    for (int i=0;i<MAX_NUM_SIZE;i++)

    {

        if(btn == btnConn[i])

        {

            qDebug()<<"slot_multi_btn_clicked: i=" <<i;

        }

    }

}

2.代码:方式二(QT6 推荐)

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)

    : QMainWindow(parent)

    , ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    btnConn[0]=ui->pushButton;

    btnConn[1]=ui->pushButton_2;

    btnConn[2]=ui->pushButton_3;

    btnConn[3]=ui->pushButton_4;

    btnConn[4]=ui->pushButton_5;

    // 使用Lambda表达式捕获上下文

    for(int i=0; i<MAX_NUM_SIZE; i++){

        connect(btnConn[i], &QPushButton::clicked, this, [this, i](){

            // 直接使用索引i操作

            multi_btn_clicked(i);

        });

    }

    

}

MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::multi_btn_clicked(int i)

{

    qDebug()<<"slot_multi_btn_clicked two: i=" <<i;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913944.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913944.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913944.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

康养休闲旅游服务实训室建设方案:理实一体化的产教融合方案

一、康养休闲旅游服务实训室建设方案建设原则对接行业真实场景&#xff1a;实训环境与设备设施严格参照健康咨询、旅行社及相关服务、住宿业、餐饮业等行业的真实职业场景搭建&#xff0c;确保实训项目与岗位工作内容高度匹配&#xff0c;实现工学结合、理实一体化教学。融合前…

微服务架构的演进:迈向云原生——Java技术栈的实践之路

随着云计算技术的快速发展&#xff0c;微服务架构正逐步向云原生&#xff08;Cloud Native&#xff09;演进。云原生不仅是一种技术体系&#xff0c;更是一种开发和运维理念的革新。本文将以Java技术栈为例&#xff0c;结合Kubernetes&#xff08;K8s&#xff09;、服务网格&am…

CVE-2025-32463复现

目录背景知识chroot环境chroot 环境的具体表现Name Service Switch (NSS)机制漏洞简介环境搭建复现POC分析防御方法参考文章&#xff1a;背景知识 chroot环境 &#xff08;全称“change root”&#xff09;是一种Unix/Linux系统中的隔离技术&#xff0c;其核心作用是将进程的…

原生微信小程序研发,如何对图片进行统一管理?

目标&#xff1a; 统一在配置文件中管理图片&#xff0c;用变量存储&#xff0c;换图标时只需修改链接即可&#xff0c;无需更改业务代码&#xff0c;且方便查找。tips: 不建议在 asset 中存储大量图片&#xff0c;原因是官方要求小程序内存要限制在2M以内&#xff0c;图片放多…

Escrcpy(手机投屏) v1.27.2 便携版

Escrcpy 是一款强大的工具&#xff0c;它允许用户通过图形化的 Scrcpy 界面来显示和控制他们的 Android 设备。这款应用程序由 Electron 作为其底层框架驱动。Escrcpy 无需任何账户就可以使用&#xff0c;无需担心隐私或安全问题。Escrcpy没有广告&#xff0c;完全免费开源。软…

element-plus表单校验失败问题

一、问题&#xff1a;做表单校验时&#xff0c;自定义校验和常规校验都失败&#xff0c;自定义校验时无法拿到value值。二、原因&#xff1a;1、变量名称那没有绑定prop。如果是常规校验&#xff0c;没绑定prop的话&#xff0c;在确定按钮时&#xff0c;valid都是true。2、自定…

jmeter做跨线程组

多线程通常会将不同的业务逻辑分配到不同的线程组中。为什么要做多线程&#xff1a;模拟真实世界场景&#xff1a;在实际应用中&#xff0c;服务器通常需要同时处理来自多个用户的请求。通过多线程&#xff0c;JMeter可以模拟这种并发用户的行为&#xff0c;更准确地反映出应用…

SQL实战:多表查询篇

文章目录多表查询创建练习用的数据库链接/连接查询交叉连接自然连接内连接(取交集)外连接左外连接/右外连接自连接子查询联合查询总结数据库的备份和恢复命令行操作多表查询 -- 获得 alice的 部门所在城市 select * from staff where namealice; -- 获得dept_id1 select city …

交通银行基于HarmonyOS数字盾服务,实现大额转账安全

在近日落幕的华为开发者大会2025&#xff08;6月20日-6月22日&#xff09;上&#xff0c;交通银行作为HarmonyOS安全合作的关键伙伴受邀出席。在大会的主题演讲上介绍了交通银行基于HarmonyOS SDK设备安全服务&#xff08;Device Security Kit&#xff09;中的数字盾服务&#…

加密狗硬复制的方法

加密狗硬复制方法概述&#xff1a;Greer82加密狗&#xff08;Dongle&#xff09;是一种硬件加密设备&#xff0c;用于软件版权保护。硬复制是指通过物理手段复制加密狗的硬件信息&#xff0c;通常涉及破解或仿制。需要注意的是&#xff0c;未经授权的复制可能涉及法律风险&…

家庭网络中的服务器怎么对外提供服务?

家庭网络中的服务器怎么对外提供服务&#xff1f;方案1 DDNS&#xff08;家庭网络需要有公网ip&#xff09;方案2 内网穿透&#xff08;需要有一台公网ip的服务器&#xff09;方案1 DDNS&#xff08;家庭网络需要有公网ip&#xff09; 怎么判断是否有公网ip&#xff1f;大致的流…

UnrealEngine5游戏引擎实践(C++)

目录 目录 目录 Unreal Engine 是什么? Unreal Engine 5 简介 核心技术特性 应用场景扩展 兼容性与生态系统 Unreal Engine安装 下载 Epic Games Launcher 启动 Unreal Engine 选择安装版本和路径 选择组件 开始安装 验证安装 配置项目模板(可选) 更新和插件…

web渗透sql注入4之PostgreSQL

web渗透sql注入4之PostgreSQLPostgreSQL数据库特性&#xff1a;基于角色的访问控制&#xff0c;支持超级用户&#xff0c;需安装 plpgsql 扩展方可执行命令&#xff0c;可通过 COPY命令或自定义函数实现权限判断白盒看代码&#xff0c;黑盒通过构造特殊查询语句探测数据库权限权…

2025年7月:打cs1.5 600元装机台式电脑方案A

打cs1.5 600元装机方案A&#xff1a;有需要的小伙伴可以收藏哈&#xff0c;目前我没有机会实测效果&#xff0c;理论值是ok无压力的&#xff0c;大家 有机会配置后的&#xff0c;也可以自行测试下CS1.5的FPS值稳定否哈哈。 打cs1.5 600元装机方案A&#xff1a; 点击查看详细内…

人大金仓下载安装教程总结

文章目录前言背景&#xff1a; 工作中进行信创改造&#xff0c;需要把mysql&#xff0c;postgresql数据迁移到人大金仓一、人大金仓是什么&#xff1f;二、使用场景三、下载安装教程四、优势五、环境及要求六、工具以及词汇介绍总结前言 背景&#xff1a; 工作中进行信创改造&…

WebDAV与内网穿透的协同创新:Joplin私有云同步架构深度解析

文章目录前言1. 检查群晖Webdav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar工具4. 创建Webdav公网地址5. Joplin连接WebDav6. 固定Webdav公网地址7. 公网环境连接测试前言 在远程办公场景持续深化的数字化时代&#xff0c;数字笔记工具已从单纯的记录载体进化为知识管理的…

html的outline: none;

outline: none; 是一条 CSS 样式规则&#xff0c;用来取消元素获得焦点时的默认轮廓线&#xff08;outline&#xff09;。&#x1f50d; 什么是 outline&#xff1f;outline 是浏览器在某些元素&#xff08;例如输入框 <input>、按钮 <button>、可编辑元素如 <d…

Java 正则表达式白皮书:语法详解、工程实践与常用表达式库

一、什么是正则表达式&#xff1f;正则表达式&#xff08;Regular Expression&#xff09;是一种文本模式&#xff0c;用于描述、匹配、搜索或替换符合某种规则的字符串。其在日志提取、表单校验、配置清洗、数据爬取等场景中被广泛使用。Java 提供了完整的正则表达式支持&…

火山引擎Data Agent全面上线售卖!以企业级数据智能体,重构数据应用范式

资料来源&#xff1a;火山引擎-开发者社区 在火山引擎2025春季FORCE原动力大会现场&#xff0c;火山引擎数智平台解决方案总经理萧然宣布&#xff0c; 企业级数据智能体Data Agent即日起正式上线售卖 。该产品旨在通过DataAI的深度融合&#xff0c;助力企业实现数据价值的挖掘与…

uniapp AndroidiOS 定位权限检查

定位权限检查 // 检查定位权限状态 export const checkPermission () > {const platform uni.getSystemInfoSync().platform;console.log(platform, platform)// #ifdef APP-PLUSif (platform android) {// Androidreturn checkAndroidPermission();} else if (platform …