【转】18.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 编程的基础,使用信号与槽机制可以比较容易地将信号与响应代码关联起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

可以买的一本书:3D计算机图形学(原书第3版)

作  者(英)沃特(Watt,A.) ,包宏 译出 版 社机械工业出版社图书定价¥69.00 第1章 计算机图形学的数学基础 11.1 处理三维结构 11.1.1 计算机图形学中的三维仿射变换 11.1.2 改变坐标系的变换 61.2 结构变形变换 71.3 向量和计算机…

网站中毒

刚做了一个网站2008-应届生-校园招聘信息博客 购买了虚拟空间,可是发布没几天就发现中毒了打开网站首页,查看源文件,发现页面头部被加了一段代码 下载有关的文件并没有这行代码?不知道为什么?这段代码到底加到哪里了呢…

程序员找工作那点事儿

从7月中旬回武汉之后开始系统的复习,到9月下旬正式开始找工作,最后到10月中旬结束,前后历时三个月,从前期的职业定位,到中期的复习准备,最后到后期真枪实弹的笔试面试,个人感觉找工作就是个系统…

【转】QT介绍

一、Qt介绍 Qt,坦白来说,并不只是一个界面库,他是C编程思想的集大成者。它是一个经过完善的C应用程序框架。使用Qt,在一定程度上你获得的是一个“一站式”、“全方位”的解决方案,STL、string、XML、数据库、网络这些…

mysql函数未定义_未定义的函数,MYSQL错误

提交以下表单时,我收到此错误:Fatal error: Call to undefined function mysqli_connect() in .... mailing_list_include.php on line 7这里是mailing_list_include.php文件 - 真正的东西包括访问数据库的正确凭据function doDB() {global $mysqli;// c…

简单的实现RAII封装。

简单的实现RAII封装。前面的文章中介绍了通过RAII的技术实现保证资源被释放和某函数被执行的类似finally关键字的功能。并演示了一个通过boost的function和bind的两个库实现的通用RAII封装类。 那个例子固然通用而有效,然而,我们有时项目中并没有用到boo…

二叉树序列化

文件的大小尽可能的小。 想了四种方法: 第一种方法:把二叉树按前序和中序遍历一遍,存两次二叉树。 第二种方法:将二叉树按左枝为0,右枝为1进行路径编码,那么每个节点都可以表示成,节点信息和路径…

【转】OWIN是什么?

OWIN的英文全称是Open Web Interface for .NET。 如果仅从名称上解析,可以得出这样的信息:OWIN是针对.NET平台的开放Web接口。 那Web接口是谁和谁之间的接口呢?是Web应用程序与Web服务器之间的接口,OWIN就是.NET Web应用程序与W…

java 切换panel会闪烁_【19期】为什么Java线程没有Running状态?

Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:什么是 RUNNABLE?直接看它的 Javadoc 中的说明&am…

winCE下Unicode编码

Unicode :宽字节字符集1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?可以调用Microsoft Visual C的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。调用strlen函数,无…

【转】PSTools工具使用方法

转自:https://blog.csdn.net/hongkaihua1987/article/details/85230082 https://blog.51cto.com/winhe/1742633 本篇文章是基于pstools 2.7版本。pstools是sysinternals出的一个功能强大的nt/2k远程管理工具包。 它的主页为http://www.sysinternals.com/ 下载地址…

多标签文本分类数据集_标签感知的文档表示用于多标签文本分类(EMNLP 2019)...

原文:Label-Specific Document Representation for Multi-Label Text Classification(EMNLP 2019)多标签文本分类摘要:本文使用标签相关的注意力网络学习文档表示。该方法在构建文档表示时使用了标签的语义信息来决定标签和文档的…

wince串口驱动分析(转)

wince串口驱动分析 串行通讯接口主要是指UART(通用串行)和IRDA两种。通常的串行连接电气连接上有3wire和9wire两种。3wire的接线方式下定义了发送、接收和地三根连接。其用途就如名称一样分别用于发送、接收。 通常在串行接口控制器上会有两个FIFO用作接收和发送的缓冲&#xf…

【转】DHF、DMR、MDF、DHR医疗器械文件要求与解读

1、DMR:Device Master Record 器械主文档,法规条款:FDA QSR820.181 2、DHR: Device History Record,法规条款:FDA QSR820.184 3、DHF: Design History File,法规条款:FDA QSR820.30(j) 4、MDF: …

a.pop啥意思python_python中pop什么意思

python中pop什么意思,赋值,移除,元素,位置,变量python中pop什么意思易采站长站,站长之家为您整理了python中pop什么意思的相关内容。python中pop()将列表指定位置的元素移除,同时可以将移除的元素赋值给某个变量,不填写位置参数则默认删除最后…

你是个有魅力的人吗?人格魅力这样修养而成

所谓“人格魅力”是指一个人在与其他人交往中,另别人内心感到信服、愉快、安全等感受的综合概念。他一般是针对一个组织中“领导者”的专有评价。“人格魅力”有先天形成的部分,但更重要的是后天自身的悟性和修养。先天的部分主要是指个人的兴趣&#xf…

【转】CAN 通信测试工具 canutils

转自:https://blog.csdn.net/engrossment/article/details/105222753 概述 CAN,Controller Area Network,控制器局域网,一种高可靠性的现场总线。广泛用于汽车电子、工业控制通信。 canutils 工具包内含 5 个独立的程序&#x…

个人博客php mysql_Windows下搭建个人博客(Apache+MySQL+PHP+WordPress)

Windows下搭建个人博客(ApacheMySQLPHPWordPress)CSDN博客的广告实在是烦,就自己在阿里云上搭建了一个博客(http://www.corfox.cn),CSDN博客可能就很少用啦。购买云服务器和域名可以在阿里云上购买云服务器ECS,阿里云针对学生有个云翼计划的优…

DCB(串口的DCB结构)

串口通讯中的DCB结构 typedef struct _DCB {// dcbDWORD DCBlength; // sizeof(DCB) DORD BaudRate; // current baud rate 指定当前的波特率 DWORD fBinary: 1; // binary mode, no EOF check 指定是否允许二进制模式WIN95中须为TRUE DWORD fParity: 1; // enable p…

IIS内部服务错误aspx与asp

打开事件查看器: 在系统事件中有错误:Distributed Transaction Coordinator 服务因 3221229584 (0xC0001010) 服务性错误而停止。 经多次试验,发现这主要是系统无法找到MS DTC 日志文件造成的,只要创建一下就可以了: 点开始→运行→输入命令"msdtc -resetlog",运行该…