Qt 编程 —— 信号与槽机制 学习笔记总结

    科技2022-08-09  107

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。


    笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。 作者:Aliven888

    1、简述

    信号槽的优点:

     他们之间是松散耦合的,信号的发送端 和 接收端本身没有关联的,通过connect连接,将两端耦合在一起。

    格式:

    connect (信号的发送者, 信发送的具体号,信号的接收者,信号的处理(槽)) 低版本Qt的写法 : connect(sender,SIGNAL(signal(...)), recv, SLOT(slot(...))); 高版本Qt的写法 : connect(sender, &class::signal, recv, &class::slot); 匿名槽函数 : connect(sender, &signal, recv, [=]{ 槽功能实现 }); connect(sender, &signal, recv, [=](const QString str){ 槽功能实现 }); //带参数的实现方式

    注意事项: 关于匿名槽函数的详细使用,可以参见这篇博客:《Qt匿名函数 - Lambda》

    演示实例:

    #pragma once #include <QWidget> #include <QPushButto> namespace Ui { class QtGuiApplicationClass; } class QtGuiApplication: public QWidget { Q_OBJECT public: myWidget(QWidget *parent = Q_NULLPTR); ~myWidget(); signals: void onCustomSignal(); //定义一个信号 public solts: void onCustomSlot(); //定义一个槽 private: Ui::QtGuiApplicationClass *ui; QPushButto *btn = new QPushButton(); //定义一个按钮对象 } QtGuiApplication::QtGuiApplication(QWidget *parent) : QWidget(parent) { ui = new Ui::QtGuiApplicationClass(); ui->setupUi(this); //Qt V4.x 的写法 connect(btn, SIGNAL(onCustomSignal), this, SLOT(onCustomSlot())); //Qt V5.x 的写法 connect(btn, &QtGuiApplication::onCustomSignal, this, &QtGuiApplication::onCustomSlot); //直接实现槽 connect(btn, &QtGuiApplication::onCustomSignal, this, [=]{qDebug("123 ***** ");}) }

    信号特点:

    1、信号的定义需要写在 “signals” 下面。2、信号没有返回值,声明时使用 void 即可。3、信号不需要实现,声明完即可使用。4、信号是可以有参数的,因此也可以进行重载。5、信号也可以作为槽(即信号可以连接信号)。6、一个信号可以连接多个槽函数(执行顺序按照绑定顺序操作)。7、多个信号也可以同时连接一个槽函数。8、信号与槽的参数类型必须一致。9、信号的参数个数可以比槽的参数个数多,但是同时有的参数类型也必须一一对应。

    槽特点:

    1、槽的定义需要写在 “public slots” 下面。2、在一些Qt的高级版本中,也可以写在public下面或者定义成全局的槽函数。3、返回值是void,可以有参数,也可以进行重载。

    触发信号:

      emit 可以用来触发信号。

    格式:

    emit onCustomSignal(); //触发信号

    2、结构体做参数

     我们在使用自定义结构体作为信号与槽的传递参数时,有时信号与槽明明已经绑定成功了,但是在触发信号时,槽函数却没有任何反应;这时因为信号-槽在使用自定义结构体做参数时,还需要对自定义结构体进行注册,否则无法使用。

    格式: Q_DECLARE_METATYPE(结构体名称)

    演示实例:

    //第一种写法(没有作用域限制): struct myStruct { int i; ... }; Q_DECLARE_METATYPE(myStruct); //注册自定义结构体 //第二种写法(有作用域限制): namespace MyNamespace { struct myStruct { int i; ... }; } Q_DECLARE_METATYPE(MyNamespace::MyStruct)

    笔记跟新记录

    时间内容2020-10-18创建笔记2020-10-23修改文中错别字2020-12-09新增 2、结构体做参数
    Processed: 0.009, SQL: 8