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

Wan*_*ang 7 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)));
Run Code Online (Sandbox Code Playgroud)

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

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

connect(signalMapper, SIGNAL(mapped(QString)),
     this, SLOT(doStuff(bool,QString)));
Run Code Online (Sandbox Code Playgroud)

但是,它不像这样工作?有什么工作吗?

谢谢!

Ale*_*iuk 7

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

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

有办法解决这个问题:

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

如果使用Qt5,那么你可以完全按照自己的需要进行操作QSignalMapper.只需将信号连接到lambda:

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

我假设taxFileButtonTaxFileButton类的实例.

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

  • 我很乐意也很容易:).现在我的项目中的类似任务以我为Qt4描述的方式解决. (2认同)