QSignalMapper我们可以将它理解为一个信号翻译器或者说是哥信号转发器。它的主要应用在于可以实现一个函数相应不同按钮的实现功能。比如我们 实现一个计算器的时候,很多不同的按钮都有 着差不多的功能,数字0~9的按钮,功能都是输入数字,只是输入的数值不一样而已, 如果不使用 QSignalMappe r,我们不得不写10个函数作为各自按钮的响应事件。这里我就通过这个简单的实例讲解下QSignalMapper的用法。
类内的成员:
QPushButton *numButt[10];
QLabel *info;
QLineEdit *inputEdit;
QHBoxLayout *hLay;
QVBoxLayout *vLay;
QGridLayout *gLay;
QSignalMapper *sigMap;
myinput::myinput(QWidget *parent) :
QWidget(parent)
{
hLay = new QHBoxLayout;
vLay = new QVBoxLayout;
gLay = new QGridLayout;
vLay->addLayout(hLay);
vLay->addLayout(gLay);
info = new QLabel(tr("the power: "), this);
inputEdit = new QLineEdit;
hLay->addWidget(info);
hLay->addWidget(inputEdit);
sigMap = new QSignalMapper(this); //创建QSignalMapper对象
for (int i = 0; i < 10; ++i) {
numButt[i] = new QPushButton(tr(QString::number(i).toStdString().c_str()), thi s);
//创建0~9按钮对象,按钮显示的text内容就是数值0~9
gLay->addWidget(numButt[i], i/4, i%4); //加入布局
connect(numButt[i], SIGNAL(clicked()), sigMap, SLOT(map() ) );
//将原始信号传递给QSignalMappe r对象
sigMap->setMapping(numButt[i ], i);
//设置转发规则,转发为参数为int型的信号,并将i作为实参传 递
}
connect(sigMap, SIGNAL(mapped(int)), this, SLOT(sl_push(int)));
//将转发信号连接到对应的槽函数
this->setLayout(vLay);
}
参考文献:
http://www.cuteqt.com/blog/?p=512
类内的成员:
QPushButton *numButt[10];
QLabel *info;
QLineEdit *inputEdit;
QHBoxLayout *hLay;
QVBoxLayout *vLay;
QGridLayout *gLay;
QSignalMapper *sigMap;
myinput::myinput(QWidget *parent) :
QWidget(parent)
{
hLay = new QHBoxLayout;
vLay = new QVBoxLayout;
gLay = new QGridLayout;
vLay->addLayout(hLay);
vLay->addLayout(gLay);
info = new QLabel(tr("the power: "), this);
inputEdit = new QLineEdit;
hLay->addWidget(info);
hLay->addWidget(inputEdit);
sigMap = new QSignalMapper(this); //创建QSignalMapper对象
for (int i = 0; i < 10; ++i) {
numButt[i] = new QPushButton(tr(QString::number(i).toStdString().c_str()), thi s);
//创建0~9按钮对象,按钮显示的text内容就是数值0~9
gLay->addWidget(numButt[i], i/4, i%4); //加入布局
connect(numButt[i], SIGNAL(clicked()), sigMap, SLOT(map() ) );
//将原始信号传递给QSignalMappe r对象
sigMap->setMapping(numButt[i ], i);
//设置转发规则,转发为参数为int型的信号,并将i作为实参传 递
}
connect(sigMap, SIGNAL(mapped(int)), this, SLOT(sl_push(int)));
//将转发信号连接到对应的槽函数
this->setLayout(vLay);
}
参考文献:
http://www.cuteqt.com/blog/?p=512