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

时间:2011-10-28 08:42:52

标签: qt qt4

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

  

QObject :: connect:不兼容的发送方/接收方参数QLabel :: linkActivated(QString) - >按钮::呼叫(int)的

如何实现这样的组合?

4 个答案:

答案 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())) }
        );
    }
}

金达丑陋的东西,但是能干。

  • 没有配对课程
  • 没有中间连接器功能