求帮助!Qt 使用connect连接信号槽函数报错

Qt 使用connect连接信号槽函数报错

在自定义的类EmoWidget(继承于 QTabWidget)里定义了信号:

signals:
    void getEmoji(int emoType,QByteArray& data);

在其他类里调用时报错

m_emoWidget = new EmoWidget;
connect(m_emoWidget,&EmoWidget::getEmoji,this,[=](int type,QByteArray& data){
        qDebug()<<type<<QString(data);
 });

报错:
D:\QT5\project\mchat\chatinputwidget.cpp:78: error: no matching member function for call to 'connect'
D:\QT5\project\mchat\chatinputwidget.cpp:80: error: no matching function for call to 'ChatInputWidget::connect(QTabWidget*&, void (EmoWidget::)(int, QByteArray&), ChatInputWidget, ChatInputWidget::init()::<lambda(int, QByteArray&)>)'
});
^

该回答引用ChatGPT4与博主@晓码自在合作编写:

这个错误是因为你的connect调用无法匹配EmoWidget::getEmoji信号。
原因有两点:

  1. connect的第二个参数需要是信号的signature,也就是信号的参数类型列表。你传入的&EmoWidget::getEmoji是信号的指针,而不是signature。
  2. 信号的参数是int和QByteArray&,而你的slot函数定义的是(int type, QByteArray& data)。参数名不同,编译器无法匹配。
    所以,正确的connect调用应该是:
    cpp
    connect(m_emoWidget, SIGNAL(getEmoji(int, QByteArray&)), this, [=](int emoType, QByteArray& data){
    qDebug()<<emoType<<QString(data);
    });
    这里,我们使用:
  3. SIGNAL宏传入getEmoji信号的正确signature SIGNAL(getEmoji(int, QByteArray&))
  4. slot函数的参数类型和名称与信号一致(int emoType, QByteArray& data)
    这样,编译器就可以正确匹配信号和slot,错误得以解决。
    所以,总结下来,Qt的信号槽连接需要注意:
  5. connect的第二个参数需要是信号的signature,而不是信号的指针
  6. 信号的参数类型和名称需要与slot函数一致,才能成功匹配
  7. 可以使用SIGNAL宏来获取信号的signature