在Qt中,信号和插槽需要匹配参数类型:
QObject :: connect:不兼容的发送方/接收方参数QLabel :: linkActivated(QString) - >按钮::呼叫(int)的
如何实现这样的组合?
答案 0 :(得分:34)
来自signals slots documentation:
信号的签名必须与接收的签名相匹配 插槽。 (事实上,一个插槽的签名可能比它的信号更短 收到因为它可以忽略额外的参数。)
这意味着形式
的信号 signal(int, int, QString
)
只能与具有以下签名的插槽连接
slot1(int, int, QString)
slot2(int, int)
slot3(int)
slot4()
正如koan所说,最好的方法是使用带有QString参数的另一个插槽,然后调用你真正想要的插槽。
答案 1 :(得分:17)
一种简单的方法是使用一个中间插槽来调用所需的插槽。 e.g。
connect(src, SIGNAL(linkActivated(QString)), this, SLOT(receiveLink(QString)));
然后
void receiveLink(QString blah)
{
int response = someFunction(blah);
mybutton->call(response);
}
您必须定义一些方法将字符串解释为int。
答案 2 :(得分:4)
插槽参数的默认值非常有用。这允许将具有不同签名的信号连接到插槽(反之亦然@pnezis答案):
i--
可能连接到不同的信号:
private slots:
void slot( int x = 10, int y = 20, QString text = QString() );
同样,Qt 4.8建议使用有用的QSignalMapper类:
该类收集一组无参数信号,并使用与发送信号的对象相对应的整数,字符串或窗口小部件参数重新发出它们。
但仅限于一个参数:
signal1(int, int, QString)
signal2(int, int)
signal3(int)
signal4()
答案 3 :(得分:0)
作为补充性答案,如果您不想编写中间插槽,则可以使用lambda表达式(当然具有C ++ 11支持)来调用该方法。但是,连接器类必须知道那些特定信号和插槽中使用的参数类型。
举个例子,假设您试图将参数类型为QString
的信号连接到参数类型为char
的插槽,您可以这样做: / p>
class SignalClass{
signals:
void testSignal(QString tString);
};
class SlotClass{
public slots:
void testSlot(char tChar);
};
class ConnectorClass{
public:
void connectSignalAndSlot () {
SignalClass tSigClass;
SlotClass tSlotClass;
connect(&tSigClass, &SignalClass::testSignal,
[=](QString tString) { this->metaObject()->invokeMethod(tSlotClass,"testSlot", Q_ARG(char, tString.at(0).toLatin1())) }
);
}
}
金达丑陋的东西,但是能干。