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

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

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上,且能分辨。每個單獨連接的話,反而麻煩)