实例的代码功能:首先我们定义两个类,老师类实现空实现,学生类实现打印老师饿了,当下课后触发信号,学生请老师吃饭。
一.信号与槽重载
当我们需要利用同名的函数传参进行链接时,就要利用函数指针去区分两个重载函数调用哪一个
1.connect函数
参数1:信号发送者 参数2:发送的信号函数(函数地址)
参数3:信号接收者 参数4:处理信号的槽函数(函数地址)
//创建一个老师对象
this->LKM= new Teacher(this);
//创建一个学生对象
this->LTH= new Student(this);
QPushButton *btn =new QPushButton("下课",this);
btn->move(100,100);
resize(400,400);
connect(LKM,teachersignal,LTH,studentsolt);
2.函数指针的语法说明
这里我们创建了两个类,一个学生类,一个老师类,我们要在teachersignal装入teacher类中的函数hungry的地址。
void hungry(QString foodname);//函数的声明
void (Teacher::*teachersignal)(QString)=&Teacher::hungry;//不是本类的一定要加作用域
void(Student::*studentsolt)(QString)=&Student::treat;
我们可以看到函数指针的语法是:
函数的返回值 (*地址变量名)(函数的形参) = &函数名
注意点:
1 .函数名只是一个名称,不要加后面的括号,类似于一个变量的变量名一样
2 .如果有类的概念,在类外时,等号左右要加上作用域
3. 当我们传入给hungry传参时,就实现了有参调用
connect(LKM,teachersignal,LTH,studentsolt);
void Widget::classIsOver()//这个是类内的成员函数定义,不能写在构造函数里面
{
//下课函数,调用后 触发老师饿了的信号
emit LKM->hungry("鱼香肉丝");//emit是触发关键字
}
void Student::treat()
{
qDebug()<<"请老师吃饭";
}
void Student::treat(QString foodname)
{
qDebug()<<"请老师吃:"<<foodname.toutf8.date();
}
二、信号与函数连接
当我们需要实现点击下课按钮时,才会发送请老师吃饭的指令,就需要将信号与槽连接
connect(LKM,teachersignal,LTH,studentsolt);
connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);
//记住传函数的地址时,&函数名即可,不要给后面添加括号
//自动添加,或者习惯,要将括号去掉
使用两个连接将信号与函数,函数与函数串联起来,实现功能
三、信号与信号连接
这种适用于无参的情况,不需要中间函数进行参数的传入,直接实现点击按钮信号到触发学生请吃饭的连接。如果连接有参,因为没有上文提到的classIsOver函数传参会报错。
void (Teacher::*teachersignal)(void)=&Teacher::hungry;
void (Student::*studentsolt)(void)=&Student::treat;
connect(btn,&QPushButton::clicked,LKM,teachersignal);
connect(LKM,teachersignal,LTH,studentsolt);
这块也可以将点击信号与学生连接起来,因为老师里是空实现。
断开连接函数
disconnect(LKM,teachersignal,LTH,studentsolt)
四、一个信号连接多个槽函数
一发工资就买iPhone14和ipad ,连接两个
五、多个信号可以连接同一个槽函数
不仅发工资可以买,发奖金也可以买,老婆给钱也可以买。
六、信号函数与槽函数的参数问题
信号与槽的参数类型必须一一对应,就是信号传给槽的形参必须保持一致。
信号与槽的参数个数 是不是要一致? 信号的参数个数只可以等于多于槽函数的参数个数
信号的参数可以自动传递给槽函数
void (Teacher::*teachersignal)(Qstring)=&Teacher::hungry;
void (Student::*studentsolt)(Qstring)=&Student::treat;
connect(btn,&QPushButton::clicked,LKM,teachersignal);
上面的代码写入Qstring为什么会出错?
- 通过帮助文档可以看到 信号函数clicked 的参数类型是bool,参数个数是一个,void时,是0个, 信号的参数个数只可以等于多于槽函数的参数个数,满足上述条件,可以成功。
- 当槽函数形参是Qstring类型时,信号函数是bool类型,参数类型不一致,所以就会出错。
信号的参数可以自动传递给槽函数
connect(ui->checkBox_4,&QCheckBox::stateChanged,[](int state){
qDebug()<<state;
});