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