【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动图制作、词云视频制作、图片一键分享及数据轻松导入…

机器学习与神经网络:诺贝尔物理学奖的新篇章

机器学习与神经网络:诺贝尔物理学奖的新篇章 Introduction Recently, the 2024 Nobel Prize in Physics was awarded to researchers in the field of machine learning and neural networks, marking a historic first. Traditionally, this prestigious award h…

网盘如何拉新方法教程

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

单点登录的要点

单点登录(Single Sign On,简称SSO)是一种身份验证和授权机制,允许用户使用一组凭据(如用户名和密码)来访问多个应用程序或系统,而无需在每个应用程序中单独进行身份验证。以下是对单点登录的详细…

第十届MathorCup高校数学建模挑战赛-A题:基于 logistic 回归和 DEA 模型对无车承运平台线路定价问题的优化和评价

目录 摘 要 一、问题重述 1.1 问题背景 1.2 目标任务 二、问题分析 三、模型假设 四、符号说明 五、模型建立和求解 5.1 问题一的分析和建模 5.1.1 成分初步筛选 5.1.2 缺失值处理 5.1.3 相关性分析 5.1.4 主成分分析 5.2 问题二的分析和建模 5.2.1 数据预处理 …

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;对比新电池性能。使用的等效电路模型以及用于校准…

数据结构编程实践20讲(Python版)—17散列

本文目录 17 散列(Hashing)S1 说明特点应用领域S2 示例:字符串哈希S2 示例:文件、图片哈希S3 应用1:食品安全追溯S4 应用2:在线内容版权保护S5 应用3:社交媒体内容审核往期链接 01 数组02 链表03 栈04 队列05 二叉树06 二叉搜索树07 AVL树08 红黑树09 B树10 B+树11 线段…

速盾:cdn高防服务器防火墙的特性是什么?

CDN高防服务器防火墙是一种专门为互联网应用提供安全防护的网络安全设备。它采用先进的技术和算法&#xff0c;通过对网络流量进行过滤和检测&#xff0c;以防止恶意攻击和非法访问&#xff0c;保障网络服务的可用性和安全性。CDN高防服务器防火墙的特性主要包括以下几个方面&a…

群晖前面加了雷池社区版,安装失败,然后无法识别出用户真实访问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;…

HTML 之 <div> 和 <span>

div 和 span 是 HTML 中两种非常常见的元素&#xff0c;但它们在页面布局和结构中的行为有所不同。它们分别是块级元素和行内元素&#xff0c;每种类型有各自的特点和用途。 1. div标签 块级元素 (Block-level element)默认样式&#xff1a;display: block特点&#xff1a; 它…

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

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

【力扣热题100】3194. 最小元素和最大元素的最小平均值【Java】

题目&#xff1a;3194.最小元素和最大元素的最小平均值 你有一个初始为空的浮点数数组 averages。另给你一个包含 n 个整数的数组 nums&#xff0c;其中 n 为偶数。 你需要重复以下步骤 n / 2 次&#xff1a; 从 nums 中移除 最小 的元素 minElement 和 最大 的元素 maxElement…