学习C++、QT---20(C++的常用的4种信号与槽、自定义信号与槽的讲解)
每日一言
相信自己,你比想象中更接近成功,继续勇往直前吧!
那么我们开始用这4种方法进行信号与槽的通信
第一种信号与槽的绑定方式
我们将按键右键后转到槽
会自动跳转到这个widget.h文件里面并自动生成了定义,我们要记住我们这个按钮叫做这个UIbtn,所以生成的叫做这个on_UIbtn_clicked();切记,我们这个函数名字不能自己去修改,因为这个函数的名字与我们的按钮对象的名字相同,这个是一种命名格式on_UIbtn_clicked();(on_对象名_信号名称)
这个只是声明,没有实现,所以我们也需要进行实现,右键这个声明里面有个Refactor重构,里面有个在widget.cpp添加定义,那么我们就可以实现功能了,比如以下的图
所以我们测试一下,点击这个按钮,那么就会实现弹出信息
没有问题
第二种信号与槽的绑定方式
我们要切记,这些信号与槽进行连接的代码需要在构造函数进行,实现,
这个代码是什么意思呢,ui的Connectbtn这个对象,发送的信号为clicked(),接受方为this,也就是这个窗口,SLOT里面就是接收方设置的槽函数,这个槽函数的话我们需要自己定义出来
在widget里面声明函数,自己复制过来,名字需要与我们的格式相匹配
然后也是进行实现,实现的话也是在Widget.cpp文件
然后我们返回也是可以的
第三种信号与槽的绑定方式
第三个种方式是lambda的方式,那么这个一样的方法,但是就是我们不需要进行槽函数的定义和实现了,因为我们是匿名函数嘛,但是要记住一下写法,
第四种信号与槽的绑定方式
第四种方式用函数指针的写法,我相信看语法,也会写的出来,槽函数需要自己定义和实现
自定义信号与槽
这个就厉害了,最终形态了,可以自己定义信号与自定义槽
怎么搞
首先,信号与槽也是需要用QObject: :connect 进行连接,我们先讲无参的,我们这边根据写出来的信号函数和槽函数,去widget.h去声明
一定要记住自定义信号需要写上signals:作为前缀,自定义槽函数需要public slots:这样来写,硬记都要记住,这个是没有办法的
然后我们同样也是将这个slot槽函数进行实现,右键在widget.cpp中添加实现,还有我们的信号函数是不需要实现的
我们的这个信号与槽绑定之后,我们还需要进行激活信号,也就是发送信号,那么这边有个关键词是emit ,我们的emit 作为信号的前缀就是触发信号的作用,意思就是我们允许这个程序,后代码执行到emit这一条代码的时候就会触发信号,那么槽函数就会被调用了
那么我们运行后就会看到返回的信息了,如果看不到怎么办,而且代码也没问题怎么办??那我们就重新构建一下项目,这样就好了
那么这边还会看到这个qDebug这个东东
在 Qt 开发中,qDebug() 是一个非常重要的调试工具,它的作用类似于 C++ 中的 std::cout,但专为 Qt 环境优化。所以我们以后都要用这个qDebug进行输出数据,因为qDebug对调试Qt程序有很好的作用,后面可以用到了再详细介绍
我们想要传参数进去,怎么传
那么这边我们需要注意的点是这个信号与槽绑定的这个语句中不是填int value 了而是填int,这个要记住
旧语法(字符串) | SIGNAL(mySignal(int)) | - 只写参数类型 |
新语法(函数指针) | &SenderClass::mySignal | - 写完整函数签名 |
当前的代码使用的是旧语法,所以只需要填 int这个参数类型就好了