转载自:https://blog.csdn.net/weixin_41320969/article/details/105579389
原因为信号的参数与槽函数参数不对应
通常发生在槽函数有参数时
槽函数:
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat(){
qDebug()<< "请老师吃饭";
}
void Student::treat(QString foodName){
qDebug() << "请老师吃" << foodName.toUtf8().data();
}
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
//Teacher类 老师类
//student类 学生类
//下课后,老师会触发一个信号,饿了,学生响应信号,请客吃饭
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师对象
this->zt = new Teacher(this);
//创建一个学生对象
this->st = new Student(this);
//点击一个按钮,再进行下课
QPushButton * btn = new QPushButton("下课",this);
setFixedSize(600,400);
//连接带参数的信号和槽
//指针->地址,函数指针->函数地址
void (Teacher::*teacherSignal)(QString) = &Teacher::hungry;
void (Student::*studentSlot)(QString) = &Student::treat;
connect(zt,teacherSignal,st,studentSlot);
//信号连接信号 一个信号触发另一个信号
//-----------------------------------------------------
connect(btn,&QPushButton::clicked,zt,teacherSignal);
//-----------------------------------------------------
}
Widget::~Widget()
{
delete ui;
}
其中
connect(btn,&QPushButton::clicked,zt,teacherSignal);
clicked的参数为bool类型
而teacherSignal的类型为QString
1.信号和槽函数的参数,类型必须进行一一对应,如信号的参数为QString,槽函数的参数也为QString
2.信号和槽函数的参数若数量不一致,则信号的参数可以多于槽函数的参数,但对应的参数也必须一致,如信号的参数为QString,bool,槽函数的参数为QString
上述错误的解决方法:使用Lambda表达式直接触发信号
connect(btn,&QPushButton::clicked,[=](){
emit zt->hungry("小憨包");
});