方式1、

可以使用Qt組件的自定義信號,你也可以自己定義信號。這種方式信號函數的參數會傳給你的槽函數的參數
方式2、QSignalMapper
原文鏈接:https://blog.csdn.net/cuteqt/article/details/4306900
簡單的理解,可以把SignalMapper這個類看成是信號的翻譯和轉發器, 它可以把一個無參數的信號翻譯成帶int參數、QString參數、QObject*參數或者QWidget*參數的信號, 並將之轉發。 這么一說大家有沒有聯想到該類的適用范圍呢? 呵呵, 是不是一下就想到了如果我有一堆的button, 可以把clicked事件放在一個函數里處理, 只要給button編個號或者給button起個名就行了, 這樣就不用給每個button寫一個slot了,豈不是很方便?
//mainwin.h
class MainWin : public QWidget { Q_OBJECT public: MainWin(QWidget *parent = 0); private slots: void doClicked(const QString & btnname);//處理最終信號的槽
private: QSignalMapper *signalMapper; };
//mainwin.cpp MainWin::MainWin(QStringList texts, QWidget *parent) : QWidget(parent) { QString buttontext = "btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10";//10個button QStringList texts = buttontext.split(","); signalMapper = new QSignalMapper(this); QGridLayout *gridLayout = new QGridLayout; for (int i = 0; i < texts.size(); ++i) { QPushButton *button = new QPushButton(texts[i]); connect(button, SIGNAL(clicked()), signalMapper, SLOT(map ()));//原始信號傳遞給signalmapper signalMapper->setMapping (button, texts[i]); //設置signalmapper的轉發規則, 轉發為參數為QString類型的信號, 並把texts[i]的內容作為實參傳遞。 gridLayout->addWidget(button, i / 3, i % 3); } connect(signalMapper, SIGNAL(mapped (const QString &)), this, SLOT(doClicked(const QString &)));//將轉發的信號連接到最終的槽函數 setLayout(gridLayout); } void MainWin::doClicked(const QString& btnname) { QMessageBox::information(this, "Clicked", btnname + " is clicked!");//顯示被按下的btn名稱。 }
從這個例子來看QSignalMapper的用法是非常簡單的, 也很容易理解。
*首先把原始不帶參數的信號連接到signalmapper的map槽函數, 這樣signalmapper能在第一時間接收到原始信號;
*其次調用setMapper方法告訴signalmapper怎樣去處理原始信號。 在這個例子中是把原始信號轉化為一個帶QString參數的信號
*最后接收轉化后的帶參數信號, 這里所把轉化后的信號與槽函數連接, 在槽函數中獲得需要的數據。
