money的大雨 2023-05-24 08:28 采纳率: 100%
浏览 50
已结题

求帮助!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&)>)'
});
^

  • 写回答

1条回答 默认 最新

  • @晓码自在 2023-05-24 08:49
    关注

    该回答引用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
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    money的大雨 2023-05-24 09:38

    感谢!

    回复
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 5月31日
  • 已采纳回答 5月24日
  • 创建了问题 5月24日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部