首页 文章

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

提问于
浏览
15

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

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

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

3 回答

  • 33

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

    connect(src, SIGNAL(linkActivated(QString)), this, SLOT(receiveLink(QString)));
    

    然后

    void receiveLink(QString blah)
    {
      int response = someFunction(blah);
      mybutton->call(response);
    }
    

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

  • 17

    来自signals slots documentation

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

    这意味着形式的信号

    signal(int, int, QString

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

    slot1(int, int, QString)
    slot2(int, int)
    slot3(int)
    slot4()
    

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

  • 3

    插槽参数的默认值非常有用 . 这允许将具有不同签名的信号连接到插槽(反之亦然@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 &)));
    

相关问题