文章目录

  • 什么是信号与槽?
  • 信号与槽原理
  • 如何实现信号与槽机制?
    • 实现方式
      • UI方式
      • 代码方式(QT4)
        • QObject类:connect和disconnect 连接函数(QT4+QT5使用)
        • 找到类与类的信号与槽函数(QT4+QT5使用)
        • 举例
        • 总结
      • 代码方式(QT5)
        • 举例
        • 总结
      • Lambda方式
      • 自定义方式
        • 总结自定义信号和槽函数的特征
      • 函数指针方式

什么是信号与槽?

通俗理解信号就是发送的某种动作或特征的表现形式。槽就是响应信号的响应动作。

场景一:十字路口信号灯

场景二 PowerPoint按键

  • 连接函数:信号与槽的绑定。要考虑发送信号的实例特征与接收信号的实例特征。即哪个灯,什么动作,哪辆车这些问题。
  • 槽函数:信号的响应动作函数。
  • 对应关系:一对多,多对一,多对对,一对一。

信号与槽原理

信号与槽时用于对象之间的通信,是Qt的核心。

信号与槽不是C++标准代码,是QT特有的。会通过MOC(Mete-Objeci Compiler)进行重新编译为C++。

MOC编译流程

QT程序 C++语法文件(MOC得到)+源码C++文件 C++编译器 二进制文件

如何实现信号与槽机制?

实现方式

UI方式

利用控件和信号与槽编辑器。

步骤

  • 方式一:

新建控件->右键控件(转到槽)->选择信号->编辑槽函数;

  • 方式二:

新建控件->在信号与槽编辑器中选择发送者,信号,接收者和槽函数。

好处:操作方便
坏处: 看不到连接函数等详细步骤,处理复杂逻辑不适用。

代码方式(QT4)
QObject类:connect和disconnect 连接函数(QT4+QT5使用)


在QObject 类中有一个Public Function为connect函数。

以及Static Public Menbers有大量重载的connect函数。

找到类与类的信号与槽函数(QT4+QT5使用)

如QWidget类,即界面类。
找到他发出的信号与他的槽函数入如下:

举例
connect(ui->pushButton_3,SIGNAL(clicked()),this,SLOT(close()));

解释:
发送方:ui->pushButton_3
发送信号:clicked();
接收对象: this即改界面QWidget类实例。
接收槽函数:close();//退出

总结

好处:信号与槽比较直观
坏处:
使用宏定义时,如果存在错误,在编译阶段不会报错,运行阶段会报错。

运行connect(ui->pushButton_3,SIGNAL(click()),this,SLOT(close()));clicked变成click就会报错。

使用宏定义时,宏定义里面的参数,不能加参数名,只能加参数类型。

运行connect(ui->pushButton_3,SIGNAL(clicked(bool check )),this,SLOT(close()));就会报错,改成connect(ui->pushButton_3,SIGNAL(clicked(bool)),this,SLOT(close()));就可以。

代码方式(QT5)
举例
connect(ui->pushButton_4,&QPushButton::clicked,this,&QWidget::close);
总结

好处:能完美解决QT4的问题
坏处:
信号和槽函数不能传参

解决:自定义槽函数,信号方式(针对QT5不能传参的问题)

改进一:将槽函数入口自定义:(QT4不支持)

connect(ui->pushButton_4,&QPushButton::clicked,this,&QtDesigner::customSlot);
void QtDesigner::customSlot(){this->close();
}
Lambda方式
    connect(ui->pushButton_5,&QPushButton::clicked,this,[=](){this->close();});
自定义方式
//自定义
connect(ui->pushButton_6,&QPushButton::clicked,this,[=](){emit customSignal();//触发信号
});   connect(this,&QtDesigner::customSignal,this,&QtDesigner::customSlot);void QtDesigner::customSlot(){this->close();
}

其中ui实例中的定义包含:

signals:void customSignal(); //仅声名,未定义。
private slots:void customSlot();
总结自定义信号和槽函数的特征
  • 自定义信号函数
  1. 关键字前面不要加访问控制符private,public,protected
  2. 只需要声名,不需要定义。使用emit激活信号
  3. 返回类型为void
  • 自定义槽函数特征
  1. 关键字前面要加访问控制符private,public,protected
  2. 需要声名和定义。
  3. 返回类型为void
函数指针方式
//函数指针void(QtDesigner::*closeui)() = &QtDesigner::customSlot;connect(ui->pushButton_7,&QPushButton::clicked,this,closeui);

QT5开发之 信号与槽机制相关推荐

  1. QT5开发及实例学习之二信号和槽机制

    文章目录 前言 一.信号与槽机制的连接方式 二.信号与槽机制的优点 三.信号与槽机制的效率 前言 Qt提供了信号和槽机制用于完成界面操作的响应,信号和槽机制是完成任意两个Qt对象之间的通信机制.其中, ...

  2. QT 的信号与槽机制介绍

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  3. 【qt】QT 的信号与槽机制

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  4. 【转载】QT 的信号与槽机制介绍

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  5. qt学习之路3 ---信号与槽机制

    信号和槽机制 1.概述 Qt采用了一种全新的对象和方法的关联与通信机制,称为信号和槽机制.信号和槽机制是独立于标准C++编译器的,在编译之前需要经过Qt的专门预处理工具MOC(Meta Object ...

  6. QT信号与槽机制需要注意的问题

    1.信号与槽的效率是非常高的,但是同真正的回调函数比较起来,由于增加了灵活性,因此在速度上还是有所损失.当然这种损失相对来说是比较小的,但是要追求高效率的话,比如实时系统,就要尽可能避免. 2.信号与 ...

  7. QT每日一练day8:信号与槽机制

    一. 创建一个空的项目 添加QT的支持 添加main.cpp 编译报错,Q_OBJECT放在CPP文件中会报这个错误,必需放头文件,这个宏比较特殊,只有放头文件才能展开 添加头文件test.h mai ...

  8. QT从入门到入土(三)——信号和槽机制

    摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...

  9. Qt源码分析之信号和槽机制

    Qt的信号和槽机制是Qt的一大特点,实际上这是和MFC中的消息映射机制相似的东西,要完成的事情也差不多,就是发送一个消息然后让其它窗口响应,当然,这里的消息是广义的 说法,简单点说就是如何在一个类的一 ...

最新文章

  1. C++容器(三):pair类型
  2. webpack/gulp的z-index被改写
  3. 认识探头(一) (转)
  4. Android学习四、Android中的Adapter
  5. OpenVINO Inference Engine之GetAvailableDevices
  6. python程序设计与应用第2章实验
  7. “操作系统不以 C 开头和结尾,C 不等于整个世界”
  8. 淘宝中间件借阿里云对外 日均调千亿次
  9. 阅读邮件回复邮件计算机操作题,《电子邮件》阅读练习题附答案
  10. python京东预约抢购流程_[Python] 京东秒杀商品抢购-茅台抢购自动获取抢购时间【修改】...
  11. java构造一个水果类_Java基础入门之Object类、匿名内部类、构造方法的继承解析...
  12. 想学PHP来兄弟连是正确的选择 初识兄弟连三周
  13. php 过滤微信符号昵称,PHP处理微信昵称特殊符号过滤方法
  14. 使用NoteExpress/Citespace/VOSviewer/EndNote进行CNKI文献计量分析
  15. Mojibakes来自哪里? 编码要点
  16. linux mysql5.7 安装、 开机启动
  17. 基于JAVASE的彩票摇号系统
  18. 如何自学UI设计?如何成为UI设计师?
  19. python 生成随机邮箱
  20. 市场调研—全球及中国腹主动脉瘤(AAA)瓣膜假体行业研究及十四五规划分析报告

热门文章

  1. 劳动节,让我们劳动起来!
  2. 一个不错的pdf转换器
  3. B75对应的服务器芯片组,两代主力 编辑带你看B75和H61相差多少
  4. 韩信点兵python算法_韩信点兵和搬砖问题
  5. 一名前端爱好者的学习之路 - 说说我和前端的认识过程我的前端学习路线(结束更新了 希望之后顺利~)
  6. 盘符被修改为*的恢复方法
  7. 守护进程(Daemon)
  8. django用户注册、登录、注销和用户扩展
  9. 404问题之文件未找到
  10. Ubuntu 16.04前置音频输出没有声音