当前位置: 首页 > 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.lryc.cn/news/584722.html

相关文章:

  • 广州华锐互动在各领域打造的 VR 成功案例展示​
  • pycharm无法识别pip安装的包
  • 【佳易王中药材划价软件】:让中药在线管理高效化、复制文本即可识别金额自动计算#中药房管理工具#快速划价系统#库存与账单一体化解决方案,软件程序操作教程详解
  • 多线程 JAVA
  • MySQL索引操作全指南:创建、查看、优化
  • H5微应用四端调试工具—网页版:深入解析与使用指南
  • 7月10号总结 (1)
  • C++ Lambda 表达式详解
  • 数据结构 顺序表(1)
  • linux-MySQL的安装
  • [数据结构与算法] 优先队列 | 最小堆 C++
  • 7-语言模型
  • 数据仓库:企业数据管理的核心枢纽
  • 基于模糊控制及BP神经网络开关磁阻电机的matlab仿真
  • 量子计算系统软件:让“脆弱”的量子计算机真正可用
  • 《Effective Python》第十三章 测试与调试——使用 Mock 测试具有复杂依赖的代码
  • Three.js+Shader实现三维波动粒子幕特效
  • 1.1.1数据类型与变量——AI教你学Django
  • SQLite3 中列(变量)的特殊属性
  • 【c++八股文】Day6:using和typedef
  • MiniGPT4源码拆解——models
  • vscode和插件用法
  • imx6ull-裸机学习实验17——SPI 实验
  • 【会员专享数据】2013-2024年我国省市县三级逐年SO₂数值数据(Shp/Excel格式)
  • Jaspersoft Studio-6.4.0 TextField内容展示不全
  • 【大模型推理论文阅读】 Thinking Tokens are Information Peaks in LLM Reasoning
  • 设计模式的六大设计原则
  • vue3 element plus table 使用固定列,滑动滚动会错位、固定列层级异常、滑动后固定列的内容看不到了
  • 二刷 黑马点评 短信登陆功能
  • MatrixOne Intelligence v3.3 正式发布:结构化、自动化、可视化三重进化