7

我遇到了一个问题,我需要保留映射源信号的参数。到目前为止,我只找到了没有任何参数的映射信号的示例。例如,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)));

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

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

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

但是,它不是这样工作的吗?有什么解决办法吗?

谢谢!

4

1 回答 1

7

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

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

有办法解决这个问题:

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

但是,如果使用 Qt5,那么您可以完全不使用任何东西来完成您需要QSignalMapper的操作。只需将信号连接到 lambda:

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

我假设taxFileButtonTaxFileButton类的实例。

如果 C++11 lambda 由于某种原因不适合,那么tr1::bind可以用于绑定this"taxfile.txt"值。请注意,当对象被销毁
时,此类连接不会自动断开。this更多细节在这里

于 2012-12-21T17:45:39.983 回答