Qt使用connect傳參數的兩種方式


方式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參數的信號

*最后接收轉化后的帶參數信號, 這里所把轉化后的信號與槽函數連接, 在槽函數中獲得需要的數據。

 

 

 

 

 

 

 

 

QSignalMapper


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM