QT之QSignalMapper(可以理解為轉發器,多個按鈕綁定到一個Edit上,且能分辨。每個單獨連接的話,反而麻煩)
阿新 • • 發佈:2017-12-14
this 不同的 lan each b2c etc gpo 知識點 span
QT之QSignalMapper
- QT之QSignalMapper
- 簡述
- 效果圖
- 上代碼
- 相關知識點文章
- 結尾
簡述
QSignalMapper我們可以理解為轉發器,此話怎講呢?比如,按鈕點擊的響應槽,綁定到QSignalMapper上,QSignalMapper收到按鈕的點擊後,又通知到另外的控件上做處理。有的朋友會問了,為什麽要這麽麻煩,需要轉一手,不能去掉中間的QSignalMapper,而直接調用嗎。答案當然是可以的,為什麽需要QSignalMapper這個轉發器呢,我們先來看下效果,然後再看看代碼,相信大家會喜歡上QSignalMapper這個轉發器的。
效果圖
上代碼
void QSignalMapper_Demo::initControl()
{
QVBoxLayout *pLayout = new QVBoxLayout(this);
QString str = "Button1 Button2 Button3 Button4 Button5";
QStringList strList = str.split(" ");
QSignalMapper *pMapper = new QSignalMapper(this);
int nRowCnt = 0;
foreach(QString itor, strList)
{
QPushButton *pBtn = new QPushButton(this);
pBtn->setFixedHeight(CON_HEGIHT);
pBtn->setText(itor);
connect(pBtn, SIGNAL(clicked()), pMapper, SLOT(map()));
pMapper->setMapping(pBtn, pBtn->text());
pLayout->addWidget(pBtn, nRowCnt++, 0);
}
QLineEdit *pEdit = new QLineEdit(this);
pEdit->setFixedHeight(CON_HEGIHT);
connect(pMapper, SIGNAL(mapped(QString)), pEdit, SLOT(setText(QString)));
pLayout->addWidget(pEdit, nRowCnt, 0);
pLayout->addStretch();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
眼光利索的朋友看到了我代碼中,代碼不規範,說你代碼怎麽就new,怎麽沒deltete,你這樣不會內存泄漏嗎,這裏告訴大家是不會的哦,相關知識可以看我之前寫的QT之內存泄漏管理。
回到本節,看完QSignalMapper的用法,我們回過頭再看看,不用QSignalMapper,又該如何實現上面的效果呢,編輯框中我們可以看到,是哪個按鈕被按下了。
//去掉QSignalMapper
void QSignalMapper_Demo::initControl()
{
QVBoxLayout *pLayout = new QVBoxLayout(this);
QString str = "Button1 Button2 Button3 Button4 Button5";
QStringList strList = str.split(" ");
int nRowCnt = 0;
foreach(QString itor, strList)
{
QPushButton *pBtn = new QPushButton(this);
pBtn->setFixedHeight(CON_HEGIHT);
pBtn->setText(itor);
//這裏,響應的是同一個槽,按鈕被點擊後,我們卻不能知道是哪個按鈕被按下。
connect(pBtn, SIGNAL(clicked()), this, SLOT(onclicked()()));
//有的朋友說,可以每個按鈕綁定不同的槽做區分呀,這樣做可以是可以,但是你覺得使用QSignalMapper是不是要更簡潔些呢?
pLayout->addWidget(pBtn, nRowCnt++, 0);
}
QLineEdit *pEdit = new QLineEdit(this);
pEdit->setFixedHeight(CON_HEGIHT);
pLayout->addWidget(pEdit, nRowCnt, 0);
pLayout->addStretch();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
看完代碼,相信大家都知道了QSignalMapper的美!有的朋友又問了,我什麽時候該用QSignalMapper呢?通過上面的例子很簡單呀,我們需要處理同一個事情時,而簡化多個不同的槽卻做著相同的事,我們的QSignalMapper就派上用場啦!
相關知識點文章
QT之內存泄漏管理。
結尾
http://blog.csdn.net/ly305750665/article/details/53790209
QT之QSignalMapper(可以理解為轉發器,多個按鈕綁定到一個Edit上,且能分辨。每個單獨連接的話,反而麻煩)