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;
}