我们如何用不同的参数连接信号和插槽?

use*_*036 15 qt qt4

在Qt中,信号和槽需要匹配的参数类型:

QObject :: connect:不兼容的发送方/接收方参数QLabel :: linkActivated(QString) - > Button :: call(int)

我该如何实现这样的组合?

pne*_*zis 35

信号插槽文档:

信号的签名必须与接收时隙的签名匹配.(事实上​​,一个插槽的签名可能比它收到的信号更短,因为它可以忽略额外的参数.)

这意味着形式的信号

signal(int, int, QString)

只能与具有以下签名的插槽连接

slot1(int, int, QString)
slot2(int, int)
slot3(int)
slot4()
Run Code Online (Sandbox Code Playgroud)

正如koan所说,最好的方法是使用带有QString参数的另一个槽,然后调用你真正想要的槽.


koa*_*oan 19

一种简单的方法是使用一个中间插槽来调用所需的插槽.例如

connect(src, SIGNAL(linkActivated(QString)), this, SLOT(receiveLink(QString)));
Run Code Online (Sandbox Code Playgroud)

然后

void receiveLink(QString blah)
{
  int response = someFunction(blah);
  mybutton->call(response);
}
Run Code Online (Sandbox Code Playgroud)

您必须定义一些方法将字符串解释为int.


okl*_*las 5

插槽参数的默认值非常有用。这允许将具有不同签名的信号连接到插槽(反之亦然@pnezis 答案):

private slots:
  void slot( int x = 10, int y = 20, QString text = QString() );
Run Code Online (Sandbox Code Playgroud)

可以连接到不同的信号:

signal1(int, int, QString)
signal2(int, int)
signal3(int)
signal4()
Run Code Online (Sandbox Code Playgroud)

Qt 4.8 还建议有用的QSignalMapper类:

该类收集一组无参数信号,并使用与发送信号的对象对应的整数、字符串或小部件参数重新发送它们。

但仅针对一个参数:

QSignalMapper* mapper = new QSignalMapper(this) ;

connect(action, SIGNAL(triggered()), mapper, SLOT(map())) ;
mapper->setMapping(action, "param value") ;

connect(mapper, SIGNAL(mapped(const QString &)),
  this, SIGNAL(clicked(const QString &)));
Run Code Online (Sandbox Code Playgroud)