我遇到了一个需要保留映射源信号参数的问题。到目前为止,我只找到了没有任何参数映射信号的示例。 例如,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)));
然而,它不像这样工作?有什么工作吗?
谢谢!
答案 0 :(得分:7)
QSignalMapper
不提供传递信号参数的功能。
见文件:
此类收集一组无参数信号,并使用与发送信号的对象相对应的整数,字符串或窗口小部件参数重新发出它们。
有办法解决这个问题:
如果使用Qt4 ,我建议您实施自己的信号映射器,它支持您需要的参数。
QSignalMapper
implementation将是很好的例子。
但如果使用Qt5 那么您可以完全按照您的需要完成所需而不使用QSignalMapper
。只需将信号连接到lambda:
connect(taxFileButton, &TaxFileButton::clicked, [this](bool arg) {
doStuff(arg, "taxfile.txt");
} );
我认为taxFileButton
是TaxFileButton
类的实例。
如果C ++ 11 lambda由于某种原因不适合,则tr1::bind
可用于绑定this
和"taxfile.txt"
值。
请注意,this
对象被销毁时,此类连接不会自动断开。
更多详细信息为here。