QSignalMapper 信號映射

QSignalMapper類收集了一系列的無參信號,然後使用相對於信號發送者來說的整數、字符串或控件參數來重新發送它們。

其實,該類的一個典型的使用場合是,大量控件都要相應槽函數,而這些槽函數的實現又大致相同。這種情況下,最直接的辦法就是仍然爲每一個控件的相應信號創建一個槽函數。但這會導致代碼的大量重複。此時,我們就可以使用QSignalMapper來實現這種需求。

QSignalMapper類支持使用setMapping()函數將一個特定的整數或字符串和一個特定的對象關聯起來。然後,可以將對象的信號連接到QSignalMapper對象的map()槽函數上,而map()槽函數又會使用與對象相關聯的整數或字符串來發送mapped()信號。所以,我們只要將我們定義的一個槽函數連接到mapped()信號,即可處理大量相似控件的槽函數。

下面,我們以一個例子來說明。其界面如下:


初始化界面的代碼如下:

void Widget::InitUi()
{
    names << "宋江" << "盧俊義" << "吳用" << "公孫勝"
          << "關勝" << "林沖" << "秦明" << "呼延灼"
          << "花榮" << "柴進" << "李應" << "朱仝"
          << "魯智深" << "武松" << "董平" << "張清";
    QGridLayout *gridLayout = new QGridLayout;
    for (int i = 0; i < names.size(); ++i)
    {
        QPushButton *button = new QPushButton(names[i]);
        connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
        signalMapper->setMapping(button, names[i]);
        gridLayout->addWidget(button, i / 4, i % 4);
    }
    connect(signalMapper, SIGNAL(mapped(QString)),
            this, SLOT(ShowName(QString)));
    setLayout(gridLayout);
}
其中,names是一個私有的QStringList變量,存儲每一個按鈕上的文本內容。ShowName()是我們定義的一個槽函數,我們就是讓所有按鈕的clicked()信號都連接到這個槽函數。在窗口類中聲明如下:

public slots:
    void ShowName(QString name);

private:
    void InitUi();

private:
    Ui::Widget *ui;
    QSignalMapper* signalMapper;
    QStringList names;

ShowName()槽函數的實現如下,簡單的彈出一個消息框,顯示當前點擊的按鈕的文本內容:

void Widget::ShowName(QString name)
{
    QMessageBox::information(this, "Name", name);
}


當然,別忘了在構造函數中,調用我們的初始化界面的方法,以及實例化我們的signalMapper對象。如下:

    ui->setupUi(this);
    signalMapper = new QSignalMapper(this);
    InitUi();


最後,大家可以自行進行測試。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章