應用場景如下:

舉一個例子,大家知道qt自帶的點擊信號是無參的,有也只是bool型別,比如我要實作上圖邏輯,因為從信號的傳回的引數無法讓我確定是哪一個按鈕按了下去,我是不是應該去定義5個槽函式,并且讓這五個按鈕的信號分別系結這五個槽函式,來實作我們的業務邏輯,
//例如這樣:
connect(btn1,SIGNAL(clicked()),this,SLOT(getText1()));
connect(btn2,SIGNAL(clicked()),this,SLOT(getText2()));
connect(btn3,SIGNAL(clicked()),this,SLOT(getText3()));
connect(btn4,SIGNAL(clicked()),this,SLOT(getText4()));
connect(btn5,SIGNAL(clicked()),this,SLOT(getText5()));
//然后再去實作getText1,getText2,getText3,getText4,getText5
其實五個槽函式里面的業務邏輯,只是輸出對于的人名,可以說是一個業務邏輯,現在卻需要五個函式,函式的作用就是為了解重復代碼,很明顯現在我們現在沒有簡潔代碼,反而是反其道而行,那么如何去改善這一寫法呢,往下看,
主要的矛盾就在于我們無非是想讓槽函式有一個引數,用來辨別是哪一個按鈕被點擊了,但是按鈕自帶的信號沒有這個引數,就算我們強行給槽函式搞一個引數,信號也不會給我們這個引數,并且也不會成功編譯,qt的槽信號機制,信號和槽的引數要對應,
那么有沒有一個能充當中間人的角色呢?有
QSignalMapper這個類可以幫我們做到,它將來自于一些有標識的發送者的signal連接在一起,
該類收集一組無參的signal,然后以整型數、或字串、或widget引數為引數重新將這些signal再次發送出去,而這里的整型數、字串和widget引數就是原本發送該signal物件的標識資訊,
說白了就是轉發器,怎么用,讓我們來一起看一下
QSignalMapper * myMapper;
myMapper = new QSignalMapper(this);
QPushButton * button[8]={ui->pushButton_1,ui->pushButton_2,ui->pushButton_3,ui->pushButton_4,
ui->pushButton_5};
for(int i = 0;i<5;i++)
{
connect(button[i], SIGNAL(clicked(bool)), myMapper, SLOT(map()));//這個map()是QSignalMapper類的槽函式,不需要我們定義
myMapper->setMapping(button[i], i);//這個i就是我們傳給槽函式的值,可以是字串,其他等等,判斷五個按鈕,使用整行就可以了,
}
connect(myMapper, SIGNAL(mapped(int)), this, SLOT(getText(int)));
//然后我們撰寫getText(int)這個槽函式即可
void MainWindow::setPushButton(int index)
{
switch(index)
{
case0:
//業務邏輯
break;
case1:
//業務邏輯
break;
case2:
//業務邏輯
break;
case3:
//業務邏輯
break;
case4:
//業務邏輯
break;
}
}
這樣是不是簡單了許多!
CSDN認證博客專家
Qt
C
C++
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258085.html
標籤:其他
上一篇:常見電子元器件的常用品牌匯總
下一篇:PAT
