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

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)));

然而,它并不像这样工作?有什么解决方法吗?
谢谢!
1个回答

7

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

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

有以下解决方法:

如果使用Qt4,我建议您实现自己的信号映射器,以支持所需的参数。
QSignalMapper的实现是一个很好的开始示例。

但是如果使用Qt5,则可以完全按照您的要求连接信号到lambda而不使用QSignalMapper

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

我假设taxFileButtonTaxFileButton类的实例。

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


那么在Qt4中除了实现自己的映射器类,没有其他简单的方法来完成这个任务吗? - Wang
2
我也很乐意获得简单的方法 :) 。目前,我的项目中类似的任务是在我为Qt4描述的方式中解决的。 - Alexander Stepaniuk
非常好。我需要它用于QLineEdit::textEdited事件,将各种控件映射到数组数据结构中(x和y索引)。所以...connect(lineEdit, &QLineEdit::textEdited, [this](const QString &str) { OnChanged(x, y, str); }); - e-holder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接