有下列几种方式可以连接到信号上

旧语法

qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget)。

connect(sender, SIGNAL (valueChanged(QString,QString)),receiver, SLOT (updateValue(QString)) );

新语法:连接到QObject成员

下面是一种新的方式来连接两个QObjects:

connect(sender, &Sender::valueChanged,receiver, &Receiver::updateValue ); 

新语法:连接到简单的函数

新语法甚至能连接到函数,不仅仅是QObjects:

connect(sender, &Sender::valueChanged, someFunction);

Qt信号与槽机制详解

信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。

信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。

GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。

槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

connect() 是 QObject 类的一个静态函数,而 QObject 是所有 Qt 类的基类,在实际调用时可以忽略前面的限定符,所以可以直接写为:

connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

其中,sender 是发射信号的对象的名称,signal() 是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。receiver 是接收信号的对象名称,slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。

SIGNAL 和 SLOT 是 Qt 的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串。例如,在 samp2_1(前面章节中的项目)的 ui_widget.h 文件中,在 setupUi() 函数中有如下的语句:

QObject::connect(btnClose, SIGNAL(clicked()), Widget, SLOT(close()));

其作用就是将 btnClose 按钮的 clicked() 信号与窗体(Widget)的槽函数 close() 相关联,这样,当单击 btnClose 按钮(就是界面上的“Close”按钮)时,就会执行 Widget 的 close() 槽函数。

关于信号与槽的使用,有以下一些规则需要注意:

  • 一个信号可以连接多个槽,例如:

    connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(addFun(int));
    connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(updateStatus(int));

    这是当一个对象 spinNum 的数值发生变化时,所在窗体有两个槽进行响应,一个 addFun()用于计算,一个 updateStatus() 用于更新状态。

    当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次执行。

    当信号和槽函数带有参数时,在 connect()函数里,要写明参数的类型,但可以不写参数名称。

  • 多个信号可以连接同一个槽,例如在 samp2_2(前面章节中的项目)中,让三个选择颜色的 RadioButton的clicked() 信号关联到相同的一个自定义槽函数 setTextFontColor()。

    connect(ui->rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
    connect(ui->rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
    connect(ui->rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()));

    这样,当任何一个 RadioButton 被单击时,都会执行 setTextFontColor() 函数。

  • 一个信号可以连接另外一个信号,例如:

    connect(spinNum, SIGNAL(valueChanged(int)), this, SIGNAL (refreshInfo(int));

    这样,当一个信号发射时,也会发射另外一个信号,实现某些特殊的功能。

  • 严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。
  • 在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT。
  • 当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

信号与槽机制是 Qt GUI 编程的基础,使用信号与槽机制可以比较容易地将信号与响应代码关联起来。

Qt信号与槽机制详解相关推荐

  1. Qt信号与槽机制详解1-创建一个带信号和槽的例子

    目录 一.编译一个例子 1.hello.h中的内容 2.hello.cpp的内容 3.main.cpp中的内容 4.tutorial.pro内容 二.moc_hello.cpp文件 1.Q_OBJEC ...

  2. 学习QT之信号槽机制详解

    学习QT之信号槽机制详解 一.Qt信号槽机制 概念:信号槽是Qt框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如:按钮检测到自己被点击了一下,它就会发出一个信号(sig ...

  3. C++框架_之Qt的信号和槽的详解

    目录 C++_之Qt的信号和槽的详解 1.概述 1.1对象树(子对象动态分配空间不需要释放) 2.信号和槽 Qt5 的书写方式:(推荐的使用)★★★★★ Qt4 的书写方式: 3.自定义信号槽 3.1 ...

  4. Qt 信号和槽机制 优点 效率的详解

    一.信号和槽机制 Qt提供了信号和槽机制用于完成界面操作的响应,是完成任意两个Qt对象之间的通信机制. 其中,信号会在某个特定情况或动作下被触发,槽是等同于接收并处理信号的函数. 二..信号和槽机制的 ...

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

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

  6. Qt信号槽机制详解及案例

    目录 信号槽 标准信号槽 自定义信号槽 信号槽 信号槽是Qt框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signa ...

  7. QT信号和槽机制分析

    QObject这个class是QT对象模型的核心,绝大部分的 QT 类都是从这个类继承而来.这个模型的中心特征就是一个叫做信号和槽(signal and slot)的机制来实现对象间的通讯,你可以把一 ...

  8. Qt基础之四:Qt信号与槽机制原理及优缺点

    目录 一.简介 二.信号和槽 三.信号(signals) 四.槽(slots) 五.在Qt中使用第三方的Signals和Slots 信号

  9. c++基础学习之QT 信号和槽机制的底层实现

    Qt 信号槽的实现 - DevBean Tech World Qt 的信号槽和属性系统基于在运行时进行内省的能力,内省意味着,我们可以列出对象的方法和属性列表,并且能够获取有关它们的所有信息,例如其参 ...

  10. Qt中事件循环机制详解

    问题1:Qt中常见的事件有哪些? 答:鼠标事件(QMouseEvent).键盘事件(QKeyEvent).绘制事件(QPaintEvent).窗口尺寸改变(QResizeEvent).滚动事件(QSc ...

最新文章

  1. WebForm开发常用代码
  2. mac os x 添加 用户 所属 组
  3. 采购订单检查/保存BADI使用
  4. 面试官问:如果MySQL引起CPU消耗过大,你会怎么优化
  5. php网站无法显示,php – 在UTF-8网站上无法正确显示的字符
  6. 如何更合理地选择图表形式
  7. 数列求和 java_[代码展示]数列求和
  8. 分布式系统工具箱 Spring Cloud 概览
  9. Windows10下安装MySQL5.0详细教程
  10. 在windows下安装 Ruby on rails 的血泪史
  11. java print argc_【转】main 函数参数 argc argv env 与命令行
  12. 电脑的热点手机连接不上怎么办
  13. 微信公号DIY:一小时搭建微信聊天机器人
  14. RTC与WebRTC有什么区别
  15. 多米诺骨牌java_通过递归和回溯找到所有可能的多米诺骨牌链
  16. 转 js控制excel打印完美解决方案
  17. java垃圾回收器有哪些_各种Java垃圾回收器的比较总结
  18. ps4移植android游戏,安卓玩PS4游戏 remote play安装教程
  19. 基于Python实现的在线教育系统考试作业案例源代码APP大作业nodejs程序设计微信小程序计算机
  20. 熊猫互娱破产清算,王健林又给王思聪成立新公司了?

热门文章

  1. Flash游戏开发必备书籍
  2. 关于希捷维修日志中 FAIL Servo Op=0100 Resp=0003 错误信息的解读
  3. bt5使用教程----主要是渗透方面
  4. java 微信 源码_java微信支付功能实现源码
  5. 用python处理excel视频教程_从零基础开始用Python处理Excel数据(第一季)课件+资料...
  6. java五子棋难度_简单五子棋JAVA
  7. 压缩包密码,办公文档密码破解实例讲解!
  8. 数字孪生:第三人称鼠标操作
  9. 浪曦视频--工厂方法模式
  10. java p3c_阿里p3c(代码规范,eclipse插件、模版,idea插件)