平时开发过程中会遇到管理一组QPushButton的槽函数,我们首先想到的方法就是挨个connect它们的click()信号,但是Qt还提供了一种更nice的方法供我们使用,那就是QSignalMapper!
假如我们自定义了一个全是Button的面板类ButtonPanel,关键声明如下:
signals:
void clicked(const QString &text);
private:
QSignalMapper *signalMapper;
UI初始化代码如下:
QStringList texts;
for(int i = 0; i < 50; ++i) {
texts.append(tr(u8"Test Btn %1").arg(i));
}
signalMapper = new QSignalMapper(this);
QGridLayout *gridLayout = ui->gridLayout;
for (int i = 0; i < texts.size(); ++i) {
QPushButton *button = new QPushButton(texts[i]);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, texts[i]);
gridLayout->addWidget(button, i / 3, i % 3);
}
connect(signalMapper, SIGNAL(mapped(QString)), this, SIGNAL(clicked(QString)));
通过关联QPushButton的click()信号到QSignalMapper的map()槽函数,并且通过setMapping方法,将每个QPushButton的click()信号进行映射,我们就可以将这一组QPushButton重新进行了组织,点击每个按钮,都会发出clicked(QString)信号,通过QString参数可以知道具体是哪一个按钮进行了点击。