QT信号和槽的实现原理

2023-11-16

信号和槽是qt用于对象之间通信的核心机制。其目的类似于当一个动作发生的时候,需要对这个动作做出相应的处理,类似的还有借助于函数指针的回调机制,通过回调函数完成对此动作的操作。但是如果对一个庞杂的系统,这种回调函数的维护是相当的麻烦和危险的,使用太多的回调会导致高耦合的情况,这在实际开发过程中是尽量避免的。QT的信号和槽机制避免了该问题,使用起来非常灵活。

使用信号与槽,首先,类必须直接或间接继承自QObject,在类入口处使用O_OBJECT宏,这是必须的,因为必须是信号槽机制由元对象系统(meta object system)提供。

信号:signals或Q_SIGNALS声明的函数,可以看作是一个请求或者一个动作的标志。如果一个对象在达到一个状态或者需要一个请求等操作的时候,其会触发这个信号。qt实现触发请求,使用emit命令(emit 信号函数)。

信号通常是没有返回值的,项目开发中一般都是void,函数中根据情况声明对应的参数列表,该函数只需要声明。

槽:slots或Q_SLOTS关键字声明,槽函数其实就是一个普通的函数,槽函数里边的参数列表应该跟绑定的信号函数参数列表(参数类型和个数)一致,当然参数个数可以比信号少,多余的信号函数参数被忽略了,注意,参数槽函数参数个数少,但是前面的顺序必须跟信号函数一致。如:

signals:

void signalsTest(int A, int B);

private:

slots:

int slotsTest(int A));

int slotsTest(int B));  //该函数不能绑定signalsTest信号。参数列表不一致

其信号槽工作的过程是:先将信号和槽函数进行绑定,当一个对象通过emit发射一个信号的时候,则和其连接的对象的槽函数进行处理,等槽函数处理完成之后emit退出并执行接下来的内容。

查找资料的时候发现有的把信号槽机制当成观察者模式来理解,开始感觉没什么问题,但是从关系的角度来说,观察者模式通常对应的关系是1对多(n)的情况,即被观察者(1)和观察者(n)。我们可以把信号当成被观察者,槽函数当成观察者,因为一个信号可以对应多个槽函数,当信号发送时绑定的槽函数都会执行,执行顺序不确定。不过信号槽机制还有多个信号对应一个槽函数的情况,以及一个信号对一个信号的情况。所以建议读者在理解的过程中注意,如果当初观察者模式时,不要只关注一个信号对应多个槽函数的情况。

 

参考:

https://blog.csdn.net/iEearth/article/details/74025072

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT信号和槽的实现原理 的相关文章

  • qt:同一份代码在vs2022 QT VS TOOL扩展和 QtCreator下运行结果不同

    公司要求用的是QtCreator 但是谁能离得开安装了Resharper的VS呢 我就在VS下装了QT的环境 开始编写调试代码 其实是两个软件都在用的 可能是没找到方法 VS下的资源文件显示不是很方便 我就用QtCreator加资源 到后面
  • Qt新建项目No valid kits found解决思路

    第一次用Qt Creator创建Project时 进入Kit Selection窗口后 会提示No Valid kits found Please add a kit in the options
  • 如何使用Qt软件实现一个圆形按钮

    要使用Qt软件实现一个圆形按钮 可以按照以下步骤进行操作 使用以上步骤 你就可以在Qt软件中实现一个圆形按钮 记得根据自己的需要调整按钮的样式和布局 在Qt的项目中创建一个新的QPushButton控件 或者使用现有的QPushButton
  • Qt学习——qt文件信息的获取

    文件信息类 QFileInfo 对文件的操作是程序开发过程中的一个基础环节 文件的读写存删都是其它操作的支撑 而文件的操作对于文件属性有很大的依赖性 对于文件信息的获取 Qt提供了专门的文件信息类 用来获取 判断文件的信息参数 写了一个简单
  • QT框架简介

    刚开始接触QT开发的时候用的是Qt 5 6 0版本 开发过程中没有仔细了解过Qt具体的框架结构 只负责项目相关模块用C 进行开发和维护 对QT本身没有关注 只是当成一个开发工具而已 随着维护的内容深入 发现来对整个项目缺乏全面的了解 不知道
  • 用QT实现同步调用WebService

    QT提供了QNetworkAccessManager来访问 QT帮助文档里有这么一段 QNetworkAccessManager manager new QNetworkAccessManager this connect manager
  • QT的UI界面效果预览快捷键

    QtCreator的界面预览 Shift Alt R 运行快捷键 Ctrl R 只构建快捷键 Ctrl B 怕忘了 自己记录一下
  • QT学习 之 QwtPlot(数学绘图)

    QT对于统计图像 函数图像等的绘制是没有相关组件的帮助的 只有利用手工绘制图片 QwtPlot是用来绘制二维图像的widget 继承自QFrame 和 QwtPlotDict 不过严格的说来 它只是一个视图窗口 真正的绘制设备是它的中心部件
  • qt学习笔记1:创建一个qt项目及一些基础知识

    1 新建第一个项目 New Project gt qt widges application 给项目创建名称 名称不能有中文和空格 创建路径中也不能有中文路径 不会报错但是运行时会报错 再下一步 到Kits 中文构建套件 用于选择编译套件
  • 模拟点击事件

    一 通过代码模拟用户对按钮的点击 模拟按钮的点击 方法一 使用btn click模拟用户的点击 btn click 方法二 两秒之后自动松开按钮 btn animateClick 2000 区别是方法一没有什么动画 界面展示 方法二有时间效
  • Qt学习之QMainWindow(一)QMainWindow简介

    详细的后续会讲到 这里重在理解过程 Qt中的顶层窗口称为MainWindow 属于类QMainWindow QMainWindow也是继承于QWidget 通过子类化QMainWindow可以创建一个应用程序的窗口 MainWindow的结
  • QML与C++混合编程

    文章参考 https blog csdn net foruok article details 32698603 http blog 51cto com 9291927 1975383 QT项目开发过程中 画面上显示的布局以及对应的数据可能
  • QT基本使用

    目录 一 QWidget QDialog QMainWIndow的异同点 二 信号与槽 1 信号与槽 2 自动关联信号与槽 3 自定义信号与槽 设定槽 设定信号 四 模态 非模态窗口 1 新窗口的创建 2 模态 非模态窗口的创建 五 加载资
  • QT信号槽跨线程传递QDataStream问题

    第一点 查看QDataStream类 可以发现这一句 Q DISABLE COPY QDataStream Q DISABLE COPY是QT的一个宏 顾名思义 意思为禁用拷贝构造函数 如果要知道这个宏的实现 可以继续F2 所以第一个结论
  • QT报错:multiple definition of 'qMain(int ,char**)'

    QT导入项目时 出现重定义错误 今天在导入人家完整的QT项目时 在导入之后 点击构建 出现很多重定义的问题 具体如下图所示 出现重定义错误 经过网上查找解决办法 得知是因为重复的导入项目 导致项目中项目文件重复引用了一些文件 如下图所示 解
  • QT发布软件

    Qt Creator 完成对release版本编译完成之后 就需要将exe文件发布出来 单纯的只拷贝exe文件是不能运行的 exe的运行需要依赖很多的Qt库 1 生成可以执行的exe文件 这里需要将exe文档放在一个单独创建的test文件夹
  • QT 手动触发一个槽函数

    QT 手动触发一个槽函数 1 使用emit关键字即可 创建一个信号 2 然后在需要的地方使用 就可以了 3 要注意的是 4 自定义界面控件的信号与槽函数 在对ui界面的控件添加槽函数的时候 直接右键添加即可 在构造函数内也不会看到conne
  • Qt 查看Qt助手的方法

    为了方便大家自学 在这里提供一种查看Qt助手的方法 1 打开软件点击帮助 在这里可以搜索关键词 2 假设搜索的是QToolBar 3 搜索的全是英文 这时可以点击 4 此时会跳到网页版Qt助手 5 使用的是 Microsoft Edge 浏
  • QT中的事件

    目录 1 QT事件 1 1 事件介绍 1 2 事件的处理 2 键盘事件 2 1 keyPressEvent 2 1 1 判断某个键按下 2 1 2 组合键操作 3 鼠标事件 3 1 鼠标单击事件 3 2 鼠标释放事件 3 3 鼠标双击事件
  • 【QT学习】基础篇 3.QT助手(数据手册)存放位置和使用

    学习STM32会使用到库函数文档来进行程序的编写 QT也有类似库函数 下列是QT助手的位置介绍 首先QT助手所在目录 这样就可以通过索引 搜索等找到相应函数

随机推荐

  • CSS:基本选择器中的ID选择器和class选择器的区别

    ID选择器 通过标签的id名称来选择标签 id 类选择器 class选择器 选择一个类别 className 区别 1 ID 选择器的是以井号 开头来定义的 类 选择器是以点 来定义的 2 ID 选择器在 HTML 中是可以通过 id 属性
  • 2_Nginx 语法

    文章目录 一些说明 配置静态资源服务器 常用指令 一些说明 指令 指令块 指令以分号结尾 一条指令可以有一个或多个参数 参数之间以空格分隔 例如 server name 指令块可以有名字或者没有名字 include 允许组合多个配置文件 以
  • 面经(一)广州保伦电子有限公司校招宣讲面经

    前言 本章主要讲述我曾参加广州保伦有限公司的学校宣讲并笔试的经历 一 经历概述 宣讲前 在得知该公司会来我们学校进行宣讲时 我看到有招聘Java开发职位 就马上决定参加该公司的宣讲 因为我们学校是最后一次宣讲的地方 自己心里也知道人肯定是招
  • Design Compiler (七)——环境、设计规则和面积约束

    本文如果有错 欢迎留言更正 此外 转载请标明出处 http www cnblogs com IClearner 作者 IC learner 本文的主要内容是讲解 约束针对的是逻辑综合下的约束 而实战部分则是在DC的拓扑模式下进行 环境属性的
  • image not loaded  try to open it externally to fix format problem

    image not loaded try to open it externally to fix format problem 图片没有加载 请从外部打开图片以解决格式问题 由于项目是直接复制过来的 图片从外部打开显示为空 直接全部替换重
  • 编码规范(三)----静态分析工具PMD

    一 简介 1 1 什么是静态代码分析 静态代码分析是指无需运行被测代码 仅通过分析或检查源程序的语法 结构 过程 接口等来检查程序的正确性 找出代码隐藏的错误和缺陷 如参数不匹配 有歧义的嵌套语句 错误的递归 非法计算 可能出现的空指针引用
  • 形象的理解TCP协议为什么要“三次握手”

    我们先来看看专业的解读是怎么简单描述 三次握手 的 以下图片来自百度百科 如果你看完一脸懵圈 不妨想想三次握手的目的 那就是确保客户端和服务器能够正常通讯 当然 本文只是从非专业的角度解释为何TCP建立连接的三次握手就能保证正常通讯 为何不
  • Java创建对象数组出现空指针报错

    public static void main String args teacher d new teacher 2 System out println d 0 其中创建的数组d的内存状态为空 输出数组d其中一个元素是null 即使随便
  • 你了解模糊测试(fuzz testing)吗?

    模糊测试 fuzz testing 是一类安全性测试的方法 说起安全性测试 大部分人头脑中浮现出的可能是一个标准的 黑客 场景 某个不修边幅 脸色苍白的年轻人 坐在黑暗的房间中 正在熟练地使用各种工具尝试进入某个系统 这种由安全人员 模拟黑
  • 图像&视频编辑工具箱MMEditing使用示例:图像超分辨率(super-resolution)

    MMEditing的介绍及安装参考 https blog csdn net fengbingchun article details 126331541 这里给出图像超分的测试代码 论文 Learning Continuous Image
  • go 流媒体服务搭建-01

    这里写自定义目录标题 go 流媒体服务搭建 01 go 流媒体服务搭建 01 新建go 项目 配置go 版本1 19 新增main go package main func main 新增go mod 文件 go mod init mym7
  • C语言之路---三大结构

    目录 1 选择结构 1 1 if else语句 1 2 switch case 语句 1 3 条件运算符 2 循环结构 2 1 whi
  • 直接修改数据库表数据

    直接修改数据库表中的数据 1 写SQL语句 select from 表名 for update 如下图所示 写好SQL后点击执行按钮或者直接按F8 2 执行完SQL后选择行上的按钮 让行信息变成可编辑状态 如下图所示 3 可按增加或者删除一
  • lambda qt 参数 槽函数_Qt界面开发(3)

    参考 QT界面开发 哔哩哔哩 干杯 bilibili www bilibili com 接 juliar Qt界面开发 1 juliar Qt界面开发 2 一 带参数的信号 前面关于信号signal 我们了解到 signals是Qt扩展的关
  • C++的STL库,vector sort排序时间复杂度 及常见容器比较

    http www cnblogs com sthv p 5511921 html http www 169it com article 3215620760 html http www cnblogs com sharpfeng archi
  • js求三个数的最大值和最小值

    如何求三个数的最大值和最小值 var x 9 y 12 c 50 var max x gt y x gt c x c y gt c y c var min x lt y x lt c x c y lt c y c console log m
  • Sharp Memory LCD (ls013b7dh03)驱动

    lcd main c include ls013b7dh03 h include oled font h void lcd main void lcd init lcd clear lcd print char 16 16 a 16 1 l
  • typeAliases设置别名会爆红?sql映射写sql语句没有提示?

    typeAliases设置别名会爆红 明明设置了别名 为什么还是爆红
  • 【MVC】快递信息管理系统

    文章目录 项目介绍 开发环境 技术栈 使用说明 技术要求 思路过程 难点及解决方法 效果展示 总结 项目介绍 该项目主要介绍基于快递信息的增删改查 什么是MVC MVC是三个单词的首字母缩写 它们是Model 模型 View 视图 和Con
  • QT信号和槽的实现原理

    信号和槽是qt用于对象之间通信的核心机制 其目的类似于当一个动作发生的时候 需要对这个动作做出相应的处理 类似的还有借助于函数指针的回调机制 通过回调函数完成对此动作的操作 但是如果对一个庞杂的系统 这种回调函数的维护是相当的麻烦和危险的