如何在使用QSignalMapper时保留源信号的参数?

时间:2012-12-21 11:27:07

标签: qt qt4 signals-slots

我遇到了一个需要保留映射源信号参数的问题。到目前为止,我只找到了没有任何参数映射信号的示例。 例如,clicked()信号:

signalMapper = new QSignalMapper(this);
signalMapper->setMapping(taxFileButton, QString("taxfile.txt"));

connect(taxFileButton, SIGNAL(clicked()),
     signalMapper, SLOT (map()));

connect(signalMapper, SIGNAL(mapped(QString)),
     this, SLOT(readFile(QString)));

但是,我需要用自己的参数映射一些信号,例如点击(bool)信号,然后SLOT需要有两个参数doStuff(bool,QString):

connect(taxFileButton, SIGNAL(clicked(bool)),
     signalMapper, SLOT (map()));

connect(signalMapper, SIGNAL(mapped(QString)),
     this, SLOT(doStuff(bool,QString)));

然而,它不像这样工作?有什么工作吗?

谢谢!

1 个答案:

答案 0 :(得分:7)

QSignalMapper不提供传递信号参数的功能。

见文件:
此类收集一组无参数信号,并使用与发送信号的对象相对应的整数,字符串或窗口小部件参数重新发出它们。

有办法解决这个问题:

如果使用Qt4 ,我建议您实施自己的信号映射器,它支持您需要的参数。
QSignalMapper implementation将是很好的例子。

如果使用Qt5 那么您可以完全按照您的需要完成所需而不使用QSignalMapper。只需将信号连接到lambda:

connect(taxFileButton, &TaxFileButton::clicked, [this](bool arg) {
    doStuff(arg, "taxfile.txt");
}  );

我认为taxFileButtonTaxFileButton类的实例。

如果C ++ 11 lambda由于某种原因不适合,则tr1::bind可用于绑定this"taxfile.txt"值。
请注意,this对象被销毁时,此类连接不会自动断开。 更多详细信息为here