在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.
插槽参数的默认值非常有用。这允许将具有不同签名的信号连接到插槽(反之亦然@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)
| 归档时间: |
|
| 查看次数: |
27273 次 |
| 最近记录: |