QT之QSignalMapper(可以理解為轉發器,多個按鈕綁定到一個Edit上,且能分辨。每個單獨連接的話,反而麻煩)


QT之QSignalMapper

 

 

簡述

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


免責聲明!

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



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