当前位置: 首页 > news >正文

Qt 学习第四天:信号和槽机制(核心特征)

信号和槽的简介

信号和插槽用于对象之间的通信。信号和插槽机制是Qt的核心特征,可能是不同的部分大部分来自其他框架提供的特性。信号和槽是由Qt的元对象系统实现的。

介绍(来自Qt帮助文档Signals & Slots)

        在GUI编程中,当我们更改一个小部件时,我们通常希望通知另一个小部件。更一般地说,我们希望任何类型的对象都能够进行交互相互沟通。例如,如果用户单击Close按钮,我们可能希望调用窗口的Close()函数。其他工具包使用回调实现这种通信。回调可以是一个指向函数的指针(函数指针),所以如果你想要一个处理函数通知你在某些事件中,您将指向另一个函数(回调函数)的指针传递给处理函数。然后,处理函数在适当的时候调用回调。虽然确实存在使用此方法的成功框架,但回调可能不直观,并且可能在确保类型正确性方面存在问题:callback arguments.

对比java的事件处理机制非常类似:

传送门:java事件处理入门icon-default.png?t=N7T8http://t.csdnimg.cn/C1SUt

connect函数的使用

点击按钮关闭窗口来进行演示信号和槽机制:widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget)
{ui->setupUi(this);//第二种new方式,省略上面两行QPushButton *btn2 = new QPushButton("关闭窗口", this);btn2->move(100,100); //按钮左上点移动到100*100的位置上connect(btn2, &QPushButton::clicked, this, &QWidget::close);
}Widget::~Widget()
{delete ui;
}

【运行结果】

补充知识点:

在GUI(图形用户界面)编程中,不同的界面元素(我们通常称之为“小部件”)之间经常需要相互通信。比如,当你点击一个“关闭”按钮时,你希望这个操作能够通知窗口进行关闭。为了实现这种通信,许多编程框架和库使用了一种叫做“回调”的机制。

什么是“回调”

简单来说,回调就是当某个事件发生时,你告诉另一个函数(或方法)去执行的一种机制。这个被告诉去执行的函数,就是我们所说的“回调函数”。回调允许程序中的不同部分在特定事件发生时相互“交谈”或“通知”。

为什么要用回调?

  • 解耦:回调允许我们将事件的发起者和处理者分开,这有助于代码的模块化和重用。
  • 灵活性:可以动态地改变或添加新的处理逻辑,而不需要修改事件的发起者。

回调的“例子”

想象一下,你是一家餐厅的服务员。当有顾客点完餐后,你不需要亲自去厨房告诉厨师做什么菜(虽然你也可以这么做,但那样效率很低),而是将订单(事件)交给一个系统(比如一个订单本或者电子点餐系统)。这个系统(或某个厨师助手)会看着订单(监听事件),并在合适的时机(比如厨房准备好做菜时)将订单(事件)交给厨师(回调函数)去处理。

在这个例子中:

  • 顾客点餐 相当于触发了某个事件(比如按钮点击)。
  • 服务员将订单交给系统 相当于将事件的处理权交给了某个机制(可能是系统、助手或框架)。
  • 厨师根据订单做菜 相当于回调函数被调用,执行了具体的处理逻辑。

回调的潜在问题

  • 不直观:对于初学者来说,回调的概念可能有些抽象,需要一定的时间来适应和理解。
  • 类型安全:在动态类型语言中,回调可能导致类型错误,因为编译器在编译时无法检查回调函数的参数和返回类型是否与预期一致。
  • 调试困难:回调可能导致调用栈变得复杂,使得调试更加困难。

尽管存在这些问题,回调仍然是GUI编程和其他许多领域中非常有用和强大的机制。随着现代编程语言和框架的发展,许多工具和库提供了更高级、更直观的替代方案(如事件监听器、信号槽机制、响应式编程等),但它们背后的基本思想仍然与回调紧密相关。

由文心大模型3.5生成

“信号”的原理(来自Qt帮助文档Signals & Slots)

        当对象的内部状态以某种方式发生变化,对象的客户端或所有者可能会感兴趣时,对象就会发出信号。信号是公共访问函数,可以从任何地方发但我们建议只从定义信号及其子类的类发出信号。
        当发出信号时,连接到它的槽通常立即执行,就像普通的函数调用一样。当这种情况发生时,信号和槽机制完全独立于任何GUI事件循环。一旦所有槽都返回,emit语句之后的代码就会执行。当使用排队连接时,情况略有不同;在这种情况下,emit关键字后面的代码将立即继续执行,而插将稍后执行。
        如果多个插槽连接到一个信号,则在信号发出时,这些插槽将按照它们连接的顺序依次执行。
        信号是由moc(Meta-Object Compiler,简称moc,处理Qt的C++扩展程序)自动生成的,不能在moc中实现。cpp文件。它们永远不光有返回类型(即使用void)。
        关于参数的注意事项:我们的经验表明,如果信号和槽不使用特殊类型它们的可重用性会更好。如果如果QScrollBar::valuechange()使用一个特殊的类型比如假设的QScrollBar::Range,它只能连接到设计的槽专门为QScrollBar。将不同的输入部件连接在一起是不可能的。

“槽”的原理(来自Qt帮助文档Signals & Slots)

        当一个连接到插槽的信号被发出时,就会调用这个插槽。Slots是普通的c++函数,可以正常调用;它们唯一的特点是所有的信号都可以连接到它们上面。
        由于slots是普通的成员函数,因此在直接调用时遵循普通的c++规则。但是,作为插槽,它们可以被任何组件调用,而不管其访问级别如何,都可以通过信号插槽连接调用。这意味着从任意类的实例发出的信号可以导致在不相关类的实例中调用私有槽。
        您还可以将插槽定义为虚拟的,我们发现这在实践中非常有用。
        与回调相比,信号和槽稍微慢一些,因为它们提供了更大的灵活性,尽管对于实际应用程序来说差异并不大。一般来说,发出连接到某些插槽的信号比直接调用接收器(使用非虚拟函数调用)慢大约10倍。这是定位连接对象、安全地遍历所有连接(例如检查后续接收器在发射期间没有被销毁)以及以通用方式编组仟何参数所需的开错。虽然10个非虚函数调用听起来很多,但它的开销比任何new或delete操作都要少得多。只要在后台执行需要new或delete的字符串、向量或列表操作,信号和槽开销只占整个函数调用成本的很小一部分。当您在插槽中执行系统调用时也是如此;或者间接调用十多个函数。信号和插槽机制的简单性和灵活性是值得的,你的用户甚至不会注意到
        请注意,当与基于qt的应用程序一起编译时,定义称为信号或槽的变量的其他库可能会导致编译器警告和错误。要解决这个问题,请#undef有问题的预处理器符号。

参考文档:http://t.csdnimg.cn/Kl21e
                  Qt帮助文档

相关文章:

Qt 学习第四天:信号和槽机制(核心特征)

信号和槽的简介 信号和插槽用于对象之间的通信。信号和插槽机制是Qt的核心特征&#xff0c;可能是不同的部分大部分来自其他框架提供的特性。信号和槽是由Qt的元对象系统实现的。介绍&#xff08;来自Qt帮助文档Signals & Slots&#xff09; 在GUI编程中&#xff0c;当我们…...

跳跃游戏Ⅱ C++简单代码

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…...

Gitlab中access token 和Deploy token的区别

在GitLab中&#xff0c;Access Token和Deploy Token是两种不同类型的令牌&#xff0c;用于不同的目的。以下是它们的主要区别&#xff1a; ### Access Token 1. **用途**&#xff1a; - 用于用户身份验证&#xff0c;允许用户以编程方式访问GitLab API。 - 可以用于克隆…...

【多线程】线程的五种创建方法

文章目录 线程在 Java 代码中编写多线程程序Thread 标准库 创建线程的写法1 . 继承 Thread 类代码回调函数休眠操作&#xff1a;sleep()抢占式执行观察线程jconsoleIDEA 内置调试器 2 . 实现 Runnable 接口代码 3. 匿名内部类创建 Thread ⼦类对象代码匿名内部类 4.匿名内部类创…...

关闭窗口工具类 - C#小函数类推荐

此文记录的是一个关于关闭窗口工具类。 /***关闭窗口工具类Austin Liu 刘恒辉Project Manager and Software DesignerE-Mail: lzhdim163.comBlog: http://lzhdim.cnblogs.comDate: 2024-01-15 15:18:00使用方法&#xff1a;CloseWindowUtil.CloseWindow(this.Handle);***/n…...

Xilinx FPGA 原语解析(一):IBUFDS_GTE3 差分时钟输入缓冲器

目录 1.使用说明 2.实例化代码 3.参数解释 4.端口连接 1.使用说明 IBUFDS_GTE3 是Xilinx FPGA 中用于高速接口的差分时钟信号输入缓冲器。 BUFDS_GTEx&#xff0c;x2/3/4&#xff08;不同系列的FPGA x的值不同&#xff09;&#xff0c;其中UltraScale使IBUFDS_GTE3…...

力扣SQL50 患某种疾病的患者 正则表达式

Problem: 1527. 患某种疾病的患者 在SQL查询中&#xff0c;REGEXP 是用于执行正则表达式匹配的操作符。正则表达式允许使用特殊字符和模式来匹配字符串中的特定文本。具体到你的查询&#xff0c;^DIAB1|\\sDIAB1 是一个正则表达式&#xff0c;它使用了一些特殊的通配符和符号。…...

k8s集群的资源发布方式(滚动/蓝绿/灰度发布)及声明式管理方法

目录 1.常见的发布方式 2.滚动发布 3.蓝绿发布 4.实现金丝雀发布&#xff08;Canary Release&#xff09; 5.声明式管理方法 1.常见的发布方式 蓝绿发布:两套环境交替升级&#xff0c;旧版本保留一定时间便于回滚优点&#xff1a;用户无感知&#xff0c;部署和回滚速度较…...

SwiftUI 中掌握 ScrollView 的使用:滚动可见性

文章目录 前言视图修饰符应用场景可见性完整示例ContentViewVideoPlayerViewScrollViewVisibilityApp 总结 前言 我们的滚动 API 中又有一个重要的新增功能&#xff1a;滚动可见性。现在&#xff0c;你可以获取可见标识符列表&#xff0c;或者快速检查并监控 ScrollView 内视图…...

中药养发护发

按照中医理论,头发和肝肾有密切联系,肝主血,肾藏精, 其华在发,肝肾强健,上荣于头,则毛发乌黑浓密. 中药育发的应用 以当归,天麻,桑疹子养血润发,配合干姜祛风活血,能通畅经络, 加快循环,激活毛囊,能促进皮肤组织营养成分吸收和废弃物的排泄,改善 头发生态. 用苦参 皂角 清热化…...

Java面试题-集合类

目录 1、请简单介绍下 Java 的集合类吧。 Collection Set TreeSet和HashSet List ArrayList 和 LinkedList 数组和链表的区别 Java 的列表有哪些实现类&#xff1f; Vector Queue Map 能说下 HashMap 的实现原理吗&#xff1f; 能说下 HashMap 的扩容机制吗&#x…...

【Vue3】组件通信之v-model

【Vue3】组件通信之v-model 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的…...

【Golang 面试 - 进阶题】每日 3 题(二)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…...

Java中等题-多数元素2(力扣)【摩尔投票升级版】

给定一个大小为 n 的整数数组&#xff0c;找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&#xff1a;[3] 示例 2&#xff1a; 输入&#xff1a;nums [1] 输出&#xff1a;[1]示例 3&#xff1a; 输入&#xff1a;num…...

100条超牛的DOS命令

目录 1. 文件和目录管理 1.1 列出文件和目录 1.1.1 dir 1.1.2 dir /w 1.2 切换目录 1.2.1 cd 1.2.2 cd .. 1.3 创建和删除目录 1.3.1 md / mkdir 1.3.2 rd / rmdir 1.4 文件操作 1.4.1 del / erase 1.4.2 copy 1.5 文件重命名 1.5.1 ren / rename 1.5.2 move …...

大数据信用报告查询会不会留下查询记录?怎么选择查询平台?

最近有不少网友都在咨询一个问题&#xff0c;那就是大数据信用报告查询会不会留下查询记录&#xff0c;会不会对自己的征信产生影响&#xff0c;下面本文就详细为大家介绍一下&#xff0c;希望对你了解大数据信用有帮助。 首先、大数据信用与人行征信是独立的 很多人只知道人行…...

JS【详解】内存泄漏(含泄漏场景、避免方案、检测方法),垃圾回收 GC (含引用计数、标记清除、标记整理、分代式垃圾回收)

内存泄漏 在执行一个长期运行的应用程序时&#xff0c;应用程序分配的内存没有被释放&#xff0c;导致可用内存逐渐减少&#xff0c;最终可能导致浏览器崩溃或者应用性能严重下降的情况&#xff0c;即 JS 内存泄漏 可能导致内存泄漏的场景 不断创建全局变量未及时清理的闭包&…...

第三期书生大模型实战营之Llamaindex RAG实践

基础任务 任务要求&#xff1a;基于 LlamaIndex 构建自己的 RAG 知识库&#xff0c;寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答&#xff0c;借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力&#xff0c;截图保存。 streamlit界面…...

【从0到1进阶Redis】Jedis 理解事务

笔记内容来自B站博主《遇见狂神说》&#xff1a;Redis视频链接 小伙伴们可以熟悉一下本专栏的 Redis 文章&#xff0c;可以更好地理解 正常操作 package oldfe.study;import com.alibaba.fastjson.JSONObject; import redis.clients.jedis.Jedis; import redis.clients.jedis.T…...

MySQL之Lost connection to MySQL server during query复现测试

测试Lost connection to MySQL server during query复现条件 环境报错信息复现测试方式一方式二 环境 Python: 3.8/3.9 Mysql: 5.x 报错信息 File "/Users/xxx/lib/python3.9/site-packages/sqlalchemy/dialects/mysql/base.py", line 2509, in do_rollbackdbapi_con…...

中国AI大模型场景探索及产业应用调研报告

AI大模型发展态势 定义 AI大模型是指在机器学习和深度学习领域中&#xff0c;采用大规模参数(至少在一亿个以上)的神经网络模型&#xff0c;AI大模型在训练过程中需要使用大量的算力和高质量的数据资源。 产业规模 2023年&#xff0c;中国大模型市场规模为147亿。结合《202…...

Linux--shell脚本语言—/—<1>

一、shell简介 Shell是一种程序设计语言。作为命令语言&#xff0c;它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令&#xff1b;作为程序设计语言&#xff0c;它定义了各种变量和参数&#xff0c;并提供了许多在高级语言中才具有的控制结构&am…...

【java框架开发技术点】通过反射机制调用类中的私有或受保护的方法

示例 假设我们有一个类 ExampleClass,其中有一个私有方法 privateMethod: public class ExampleClass {private void privateMethod(String message) {System.out.println("Private method called with message: " + message);} }我们可以使用上述代码来调用这个…...

你知道这些鼎鼎大名的Java底层核心公司吗

在讨论Java虚拟机——JVM的时候&#xff0c;有几个知名的&#xff0c;不得不提到的JVM的产品和公司。 一、Oracle HotSpot&#xff1a;这是由Sun公司开发的虚拟机。它由最初的Classic VM开始&#xff0c;到推出崭露头角的Exact VM的虚拟机&#xff0c;是现代化高性能虚拟机的最…...

C++入门级文章

一、一个用于查询C标准库内函数、操作符等的链接 https://legacy.cplusplus.com/reference/ 声明&#xff1a;该文档并非官方文档&#xff0c;但其具有易于查询和使用的优势&#xff0c;足够日常使用。 二、C的第一个程序 1、C语言中的语法在C中仍旧适用&#xff0c;首先我们来…...

modelsim仿真quartus IP

开发环境&#xff1a;quartus prime pro 20&#xff1b;modelsim se-64 10.6d 1. 生成Altera的IP库 使用quartus生成IP库&#xff0c;需要使用Simulation Library Compiler&#xff08;Tools->Launch Simulation Library Compiler&#xff09; 如下图操作&#xff0c;选择…...

PCB设计经验——布线原则

1.连线精简——避免直角布线 导线也应看作一种元器件&#xff0c;有自己的电阻&#xff0c;电感&#xff0c;电容 PCB走线在直角转弯的地方&#xff0c;信号前后部分相互影响&#xff0c;导致分布电容增加&#xff0c;对信号上升沿和下降沿有延缓影响。从阻抗的角度来说&#…...

C++进阶:设计模式___适配器模式

前言 在C的基础语法的学习后,更进一步为应用场景多写代码.其中设计模式是有较大应用空间. 引入 原本在写容器中适配器类有关的帖子,发现适配模式需要先了解,于是试着先写篇和适配器模式相关的帖子 理解什么是适配器类,需要知道什么是适配器模式.适配器模式是设计模式的一种.笔…...

“八股文“在现代编程面试中的角色重塑:助力、阻力还是桥梁?

&#x1f308;所属专栏&#xff1a;【其它】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…...

Android 安装应用-浏览阶段

应用安装的浏览阶段主要是由PackageManagerService类中的scanPackageNewLI()实现的&#xff0c;看一下它的代码&#xff1a; // TODO: scanPackageNewLI() and scanPackageOnly() should be merged. But, first, commiting// the results / removing app data needs to be move…...

国外二级域名免费申请/广州seo服务

如果在jsp文件中引入静态文件比如(.js或.css等等)&#xff0c;可以在使用 /项目名称/路径 的方式&#xff0c;但是这种方式如果在修改了项目了名称后就显得比较麻烦了。除了之外还许多方式&#xff0c;比如相对路径等等。一般情况下&#xff0c;可以先获得项目的根路径&#xf…...

好的网站设计题目/百度热搜广告设计公司

1.重载是指允许存在多个同名函数&#xff0c;而这些函数的参数表不同&#xff08;或许参数个数不同&#xff0c;或许参数类型不同&#xff0c;或许两者都不同&#xff09;。实现原理上&#xff1a;编译器根据函数不同的参数表&#xff0c;对同名函数的名称做修饰&#xff0c;然…...

ftp服务器软件/郑州网站优化seo

一个完整的mysql读写分离环境包括以下几个部分&#xff1a; 应用程序clientdatabase proxydatabase集群 在本次实战中&#xff0c;应用程序client基于c3p0连接后端的database proxy。database proxy负责管理client实际访问database的路由策略&#xff0c;采用开源框架amoeba。…...

seo网站建设 大时代/网络推广平台哪家公司最好

&#xff08;1&#xff09;先扯点没用的&#xff1a;宏观经济环境三架马车&#xff1a;出口、固定资产投资、消费。我丝毫不怀疑中国会在2035年&#xff0c;GDP超过美国。也就是说&#xff0c;我们总体来说&#xff0c;坐在中国这艘上升发展的飞机上&#xff0c;享受着红利。一…...

php 做视频网站/推广平台都有哪些

【问题描述】 湖南大学正在举办一场重要的国际学术会议&#xff0c;出席会议的 n 位科学家来自不同的国家&#xff0c;每位科学家都只熟悉一种语言&#xff0c;为方便起见&#xff0c;世界上所有的语言用1~1000的数字编号来列出。 晚上&#xff0c;主办方安排所有科学家去看电影…...

电商网站后台建设问题/个人建站

img.desaturate {   filter: grayscale(100%);   -webkit-filter: grayscale(100%);   -moz-filter: grayscale(100%);   -ms-filter: grayscale(100%);   -o-filter: grayscale(100%);}转载于:https://www.cnblogs.com/wpTing/p/9897312.html...