QT中信号与槽连接全集

实例的代码功能:首先我们定义两个类,老师类实现空实现,学生类实现打印老师饿了,当下课后触发信号,学生请老师吃饭。

一.信号与槽重载

当我们需要利用同名的函数传参进行链接时,就要利用函数指针去区分两个重载函数调用哪一个

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为什么会出错?
在这里插入图片描述

  1. 通过帮助文档可以看到 信号函数clicked 的参数类型是bool,参数个数是一个,void时,是0个, 信号的参数个数只可以等于多于槽函数的参数个数,满足上述条件,可以成功。
  2. 当槽函数形参是Qstring类型时,信号函数是bool类型,参数类型不一致,所以就会出错。
    在这里插入图片描述
    信号的参数可以自动传递给槽函数
 connect(ui->checkBox_4,&QCheckBox::stateChanged,[](int state){
        qDebug()<<state;
    });
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值