【Qt】信号和槽——信号和槽的概念、信号和槽的使用、信号和槽的优缺点、自定义信号和槽、信号和槽的断开

文章目录

  • Qt
    • 1. 信号和槽的概念
    • 2. 信号和槽的使用
    • 3. 信号和槽的优缺点
    • 4. 自定义信号和槽
    • 5. 信号和槽的断开

Qt

在这里插入图片描述
  

1. 信号和槽的概念

  信号是什么:

  在Linux中,我们知道信号是一种异步的事件通知机制,用于通知进程某个事件已经发生。它是进程间通信的一种方式。

  回顾之前的信号的三个特点,信号由谁产生,信号的类型,信号所对应的触发事件。我们可以简单的理解:Qt中的信号其实和linux的类似,本质就是让用户进行交互,触发对应的交互事件。

  所以在Qt中,信号的详细解释:就是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时 Qt 对应的窗口类会发出某个信号,以此对用户的操作做出反应。因此,信号的本质就是事件

  
  ‘’ 点击按钮、鼠标移动、鼠标按下、鼠标释放以及键盘输入… ‘’ 这些都是事件,Qt怎么样将这些信号事件通过不同的形式传递给使用者?通过函数来表示信号。

  

  槽是什么:

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

  
  所以,在 Qt 中,用户和控件的每次交互过程称为一个事件,每个事件都会发出一个信号。Qt 中的所有控件都具有接收信号的能力,且一个控件可接收多个不同信号。对于接收到的每个信号,控件会做出相应响应动作。在 Qt 中,对信号做出的响应动作称之为槽。信号和槽是 Qt 特有的消息传输机制,能将相互独立的控件关联起来,通过信号和槽机制可关联起来,实现不同的效果。

  
  信号和槽的联系和区别:

  (1)信号和槽机制底层是通过函数间的相互调用实现的。每个信号都可以用函数来表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。

  (2)信号函数和槽函数通常位于某个类中,和普通的成员函数相比,它们的特别之处在于:

  1. 信号函数用 signals 关键字修饰,槽函数用 public slots、protected slots 或者 private slots 修饰。signals 和 slots 是 Qt 在 C++ 的基础上扩展的关键字,专门用来指明信号函数和槽函数;

  2. 信号函数只需要声明,不需要定义(实现),而槽函数需要定义(实现)

  信号函数的定义是 Qt 自动在编译程序之前生成的。编写 Qt应用程序的程序员无需关注。这种自动生成代码的机制称为元编程(Meta Programming)。这种操作在很多场景中都能见到。

  

2. 信号和槽的使用

  在 Qt 中,QObject 类提供了一个静态成员函数 connect (),该函数专门用来关联指定的信号函数和槽函数

  关于 QObject,QObject 是 Qt 内置的父类。Qt 中提供的很多类都是直接或者间接继承自 QObject。

  
connect() 函数原型:

connect(const QObject *sender, const char * signal ,const QObject * receiver , const char * method , Qt::ConnectionType type = Qt::AutoConnection )

  
参数说明如下:

  sender:信号的发送者。

  signal:发送的信号(信号函数)。

  receiver:信号的接收者。

  method:接收信号的槽函数。

  type:用于指定关联方式,默认的关联方式为 Qt::AutoConnection,通常不需要手动设定。

  

  接下来我们使用Qt内置提供的信号和槽,来实现信号和槽的连接。

  代码示例:创建一个关闭按钮,点击该按钮,窗口关闭。

  

  1. 我们创建QPushButton对象,并且调整该按钮的位置、字体大小,连接信号和槽,这里的信号是QPushButton::clicked,是Qt的内置信号,表示按下按钮后的事件,槽函数是内置的Widget::close,表示关闭这个窗口。

    connect(btn,&QPushButton::clicked,this,&Widget::close);可以理解为:如果我们按下btn按钮时,按钮向自己的父类Widget界面发送了一个信号,信号告知Widget应该执行close这个函数。

在这里插入图片描述

  

  1. 运行Qt程序,我们点击图中的关闭窗口按钮。

在这里插入图片描述

  

  1. 可以看到窗口被关闭了。

在这里插入图片描述

  

3. 信号和槽的优缺点

  优点:松散耦合。 信号发送者不需要知道发出的信号被哪个对象的槽函数接收,槽函数也不需要知道哪些信号关联了自己,Qt 的信号槽机制保证了信号与槽函数的调用。支持信号槽机制的类或者父类必须继承于 QObject 类。

  缺点:效率较低。 与回调函数相比,信号和槽稍微慢一些,因为它们提供了更高的灵活性,尽管在实际应用程序中差别不大。通过信号调用的槽函数比直接调用的速度慢约 10 倍(这是定位信号的接收对象所需的开销;遍历所有关联;编组 / 解组传递的参数;多线程时,信号可能需要排队),这种调用速度对性能要求不是非常高的场景是可以忽略的,是可以满足绝大部分场景。

  

4. 自定义信号和槽

  上面的信号的槽都是使用了内置的类型,当然我们也可以自定义我们的信号和槽函数:

  代码示例(自定义槽函数):我们使用我们自己定义的closeWidget函数代替内置的Widget::close函数。

  
  自定义信号函数书注意自定义信号函数必须写到 “signals” 下;返回值为 void,只需要声明,不需要实现;可以有参数,也可以发生重载。

  自定义槽函数注意:可以写在 “public slots”下或 “public”下;返回值为 void,需要声明,也需要实现;可以有参数,可以发生重载。
  

  1. 按钮的按下事件和我们自定义的槽函数closeWidget连接,实现了关闭窗口的同时还可以在Qt的编译界面输出 " 窗口关闭 " 。

在这里插入图片描述

  

  1. 运行Qt程序,并且点击关闭窗口。
    在这里插入图片描述
      

  2. 窗口成功关闭并且输出了语句。
    在这里插入图片描述

  

  代码示例(自定义信号):我们使用自己创建的信号和内置的close函数连接,发送信号的过程使用我们自己定义的槽函数。

  1. 我们自定义了信号mySignal和槽函数closeWidget。

在这里插入图片描述
  

  1. 将自定义槽函数closeWidget和按钮按下事件连接,槽函数触发事件为发送一个自定义信号mySignal;将自定义信号mySignal和内置函数Widget::close连接,this接收到了信号就关闭窗口。

在这里插入图片描述

  

  1. 运行Qt程序,点击 “ 发送关闭窗口信号 ” 。

在这里插入图片描述
  

  1. 槽函数成功发送信号,信号成功触发close内置槽函数,窗口关闭。

在这里插入图片描述

  

5. 信号和槽的断开

  信号与槽的断开使用 disconnect 即可完成。disconnect 的用法和 connect 基本一致。

  断开了信号和槽的连接,无法关闭窗口了。

在这里插入图片描述

            

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

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

相关文章

MOE论文详解(4)-GLaM

2022年google在GShard之后发表另一篇跟MoE相关的paper, 论文名为GLaM (Generalist Language Model), 最大的GLaM模型有1.2 trillion参数, 比GPT-3大7倍, 但成本只有GPT-3的1/3, 同时效果也超过GPT-3. 以下是两者的对比: 跟之前模型对比如下, 跟GShard和Switch-C相比, GLaM是第一…

opcode从零开始

opcode从零开始 参考资料: Intel 64 and IA-32 ArchitecturesSoftware Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D, and 4() Intel64和IA-32架构软件开发人员手册组合卷:1,2a, 2B, 2C, 2D, 3A, 3B, 3C, 3D,和4 罗聪–c…

wordart.top - 轻松创建令人惊叹的文字云!

轻松创建令人惊叹的文字云/词云图!适合营销人员、教育工作者、数据爱好者、创意人员、商务人士、活动策划者和社交媒体专家等多种用户群体。支持海量模版库、自定义模板、文本快速提取、精准关键字调整、词云Gif动图制作、词云视频制作、图片一键分享及数据轻松导入…

网盘如何拉新方法教程

网盘拉新是指通过各种推广方式吸引新用户注册和使用网盘服务的过程。以下是对网盘拉新的详细解释: 一、网盘拉新的背景与意义 背景:随着互联网的发展,网盘作为一种基于云计算技术的存储服务,因其便捷性和高效性而备受欢迎。为了…

Linux debian 系桌面系统安装软件方式介绍

debian 系软件的安装方式多种多样,但对于不想花太多时间配置各种环境和依赖的用户来说,建议直接使用“新立得包管理器”安装,既方便又直观。 本文将以常用软件为例,介绍常用的几种软件安装方式。 1. 使用新立得包管理器安装&…

数据字典是什么?和数据库、数据仓库有什么关系?

一、数据字典的定义及作用 数据字典是一种对数据的定义和描述的集合,它包含了数据的名称、类型、长度、取值范围、业务含义、数据来源等详细信息。 数据字典的主要作用如下: 1. 对于数据开发者来说,数据字典包含了关于数据结构和内容的清晰…

15分钟学Go 第4天:Go的基本语法

第4天:基本语法 在这一部分,将讨论Go语言的基本语法,了解其程序结构和基础语句。这将为我们后续的学习打下坚实的基础。 1. Go语言程序结构 Go语言程序的结构相对简单,主要包括: 包声明导入语句函数语句 1.1 包声…

react+video:限制快进、倍速、画中画

实现代码&#xff1a; <video ref{videoRef} src{videoUrl} className{style.video} controls onRateChange{rateChange} onPlay{playVideo} onPause{pauseVideo} onTimeUpdate{timeUpdate} disablePictureInPicture playsInline poster{poster} controlsList"nodownl…

卸载Python

1、查看安装框架位置并删除 Sudo rm -rf /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8 2、查看应用并删除 在 /Applications/Python 3.x 看是否存在&#xff0c;如果存在并删除。 3、删除软连接 ls -l /usr/bin/py* 或 ls -…

MATLAB电车(宝马 i3)卸载电池再利用电气模型分析

&#x1f3af;要点 特性测试评估卸载电池性能以及不同温度下电池容量和电阻。使用两种电气模型评估和模拟卸载电池可利用性能。从宝马 i3模块中提取三星三元锂方形电池作为评估电池&#xff1a;容量测量、电阻测量&#xff0c;对比新电池性能。使用的等效电路模型以及用于校准…

群晖前面加了雷池社区版,安装失败,然后无法识别出用户真实访问IP

有nas的相信对公网都不模式&#xff0c;在现在基础上传带宽能有100兆的时代&#xff0c;有公网代表着家里有一个小服务器&#xff0c;像百度网盘&#xff0c;优酷这种在线服务都能部署为私有化服务。但现在运营商几乎不可能提供公网ip&#xff0c;要么自己买个云服务器做内网穿…

MacOS RocketMQ安装

MacOS RocketMQ安装 文章目录 MacOS RocketMQ安装一、下载二、安装修改JVM参数启动关闭测试关闭测试测试收发消息运行自带的生产者测试类运行自带的消费者测试类参考博客&#xff1a;https://blog.csdn.net/zhiyikeji/article/details/140911649 一、下载 打开官网&#xff0c;…

ListView的Items绑定和comboBox和CheckBox组合使用实现复选框的功能

为 ListView 控件的内容指定视图模式的方法&#xff0c;参考官方文档。 ComboBox 样式和模板 案例说明&#xff1a;通过checkBox和ComboBox的组合方式实现下拉窗口的多选方式&#xff0c;同时说明了ListView中Items项目的两种绑定方式. 示例&#xff1a; 设计样式 Xaml代码…

C++初阶学习第七弹——string的模拟实现

C初阶学习第六弹------标准库中的string类_c语言返回string-CSDN博客 通过上篇我们已经学习到了string类的基本使用&#xff0c;这里我们就试着模拟实现一些&#xff0c;我们主要实现一些常用到的函数。 目录 一、string类的构造 二、string类的拷贝构造 三、string类的析构函…

第五课:Python学习之if语句

判断&#xff08;if&#xff09;语句 目标 开发中的应用场景if 语句体验if 语句进阶综合应用 01. 开发中的应用场景 生活中的判断几乎是无所不在的&#xff0c;我们每天都在做各种各样的选择&#xff0c;如果这样&#xff1f;如果那样&#xff1f;…… 程序中的判断 # 定义…

web前端面试中拍摄的真实vue面试题

发一波web前端面试题&#xff0c;真实拍摄。最最最最最简单的vue面试题了。 image image image 如果以上都不会&#xff0c;那么vue面试基本都是凉了&#xff0c;想彻底学习一下&#xff0c;我这里在之前录制过一套vue面试题的视频教程。 视频地址&#xff1a;https://www.3moo…

小猿口算炸鱼脚本

目录 写在前面&#xff1a; 一、关于小猿口算&#xff1a; 二、代码逻辑 1.数字识别 2.答题部分 三、代码分享&#xff1a; 补充&#xff1a;软件包下载 写在前面&#xff1a; 最近小猿口算已经被不少大学生攻占&#xff0c;小学生直呼有挂。原本是以为大学生都打着本…

智慧链动青春:国家区块链中心接待北京市十一学校青少年访学探索

以生动科学的方法点燃青少年科学探索欲望是构建未来科技人才梯队的基石。近期国家区块链技术创新中心接待北京市十一学校新生访学&#xff0c;以科普讲座、实操互动的方式让学生在深度思考中感受科学魅力、接触前沿科技&#xff0c;激发学生对区块链、隐私计算和芯片设计制造的…

MES制造执行系统原型图动端 Axure原型 交互设计 Axure实战项目

MES制造执行系统原型移动端 Manufacturing Execution System prototype MES制造执行系统原型图移动端是专门为制造执行系统设计的移动端是一个可视化的设计。用于展示和演示该系统在移动设备上的功能和界面。通过原型图&#xff0c;可以清晰地了解制造执行系统在移动端的各个…

Leetcode 跳跃游戏 二

核心任务是找出从数组的起点跳到终点所需的最小跳跃次数。 这段代码解决的是“跳跃游戏 II”&#xff08;Leetcode第45题&#xff09;&#xff0c;其核心任务是找出从数组的起点跳到终点所需的最小跳跃次数。 class Solution {public int jump(int[] nums) {//首先处理特殊情…