QSignalMapper类使用
如果我们想要将一组按钮的信号(比如说 clicked() 信号)与一个相同的槽函数相关联,可以有两种方法。
1.我们可以使用 connect 函数将每一个按钮的 clicked() 信号与这个槽函数关联。很明显,这样子很烦,不够聪明。
2.或者使用 QSignalMapper 类,如下所示:
buttonwidget.h 如下:
#ifndef BUTTONWIDGET_H
#define BUTTONWIDGET_H
#include <QWidget>
#include <QSignalMapper>
class ButtonWidget : public QWidget
{
Q_OBJECT
public:
explicit ButtonWidget(const QStringList &texts, QWidget *parent = 0);
signals:
public slots:
void clicked(const QString &text);
private:
QSignalMapper *signalMapper;
};
#endif // BUTTONWIDGET_H
buttonwidget.cpp 如下:
#include "buttonwidget.h"
#include <QGridLayout>
#include <QPushButton>
#include <QDebug>
ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent) :
QWidget(parent)
{
signalMapper = new QSignalMapper(this);
QGridLayout *gridLayout = new QGridLayout;
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/5, i%5);
}
connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(clicked(QString)));
setLayout(gridLayout);
for(int i=0; i<texts.size(); ++i)
{
qDebug() << signalMapper->mapping(texts.at(i));
}
}
void ButtonWidget::clicked(const QString &text)
{
qDebug() << text;
}