在Qt中,信号和槽需要匹配的参数类型:
QObject :: connect:不兼容的发送方/接收方参数QLabel :: linkActivated(QString) - > Button :: call(int)
我该如何实现这样的组合?
一种简单的方法是使用一个中间插槽来调用所需的插槽 . 例如
connect(src, SIGNAL(linkActivated(QString)), this, SLOT(receiveLink(QString)));
然后
void receiveLink(QString blah) { int response = someFunction(blah); mybutton->call(response); }
您必须定义一些方法将字符串解释为int .
来自signals slots documentation:
信号的签名必须与接收槽的签名相匹配 . (事实上,一个插槽的签名可能比它收到的信号更短,因为它可以忽略额外的参数 . )
这意味着形式的信号
signal(int, int, QString )
signal(int, int, QString
只能与具有以下签名的插槽连接
slot1(int, int, QString) slot2(int, int) slot3(int) slot4()
正如koan所说,最好的方法是使用带有QString参数的另一个槽,然后调用你真正想要的槽 .
插槽参数的默认值非常有用 . 这允许将具有不同签名的信号连接到插槽(反之亦然@pnezis答案):
private slots: void slot( int x = 10, int y = 20, QString text = QString() );
可以连接到不同的信号:
signal1(int, int, QString) signal2(int, int) signal3(int) signal4()
另外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 &)));
3 回答
一种简单的方法是使用一个中间插槽来调用所需的插槽 . 例如
然后
您必须定义一些方法将字符串解释为int .
来自signals slots documentation:
这意味着形式的信号
signal(int, int, QString
)只能与具有以下签名的插槽连接
正如koan所说,最好的方法是使用带有QString参数的另一个槽,然后调用你真正想要的槽 .
插槽参数的默认值非常有用 . 这允许将具有不同签名的信号连接到插槽(反之亦然@pnezis答案):
可以连接到不同的信号:
另外Qt 4.8建议有用的QSignalMapper类:
但仅限于一个参数: