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

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

一.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.dtcms.com/a/271959.html

相关文章:

  • git多分支管理
  • 缺陷的生命周期(Bug Life Cycle)是什么?
  • Java 正则表达式白皮书:语法详解、工程实践与常用表达式库
  • WWDC 25 风云再起:SwiftUI 7 Charts 心法从 2D 到 3D 的华丽蜕变
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(四十二) -> 动态修改编译配置
  • 全面解析 wxPython:构建原生桌面应用的 Python GUI 框架
  • 【计算机基础理论知识】C++篇(二)
  • [python] 数据拷贝浪费内存,原地修改暗藏风险:如何平衡内存使用效率与数据完整性?
  • 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
  • C++类对象多态底层原理及扩展问题
  • Python-GEE遥感云大数据分析与可视化(如何建立基于云计算的森林监测预警系统)
  • Yolov模型参数对比
  • Docker的/var/lib/docker/目录占用100%的处理方法
  • 变压器初级(原边)和次级(副边)的感应电动势、电压方向如何标注?
  • 安卓应用启动崩溃的问题排查记录
  • 《Effective Python》第十三章 测试与调试——使用 Mock 测试具有复杂依赖的代码
  • 【笔记分享】集合的基数、群、环、域
  • Python毕业设计232—基于python+Django+vue的图书管理系统(源代码+数据库)
  • EXCEL_单元格中图片调整代码留存
  • 什么是Kibana
  • 【C++】第十四节—模版进阶(非类型模版参数+模板的特化+模版分离编译+模版总结)
  • 保姆级搭建harbor私有仓库与docker-ce教程与使用教程
  • 机器学习基础:从理论到实践的完整指南
  • 解锁医疗新视界:医患共决策时间轴AI可视化工具
  • Linux面试问题-软件测试
  • Web前端:table标签的用法与属性
  • 酒店IPTV系统:重塑数字化时代的宾客体验生态
  • 图计算怎么用?从数据到关系的魔力
  • 实时风险监控系统工具设计原理:2025异常检测算法与自动化响应机制
  • 深度学习中的激活函数