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

news2024/9/23 17:23:18

信号和槽的简介

信号和插槽用于对象之间的通信。信号和插槽机制是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帮助文档

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

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

相关文章

安装sqllab靶机之后,练习关卡报403 forbidden

解决办法&#xff1a; 在nginx的conf文件中添加上访问index.php vim /usr/local/nginx/conf/nginx.conf 保存退出 再重启一下nginx&#xff0c;就完成了。 ./nginx -s reload

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

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

python pip怎么安装包

按WinR键打开运行窗口&#xff0c;输入“cmd”&#xff0c;再按回车键&#xff0c;打开命令行窗口。 找到pip安装路径。 Python2/Python3安装路径是相同的&#xff0c;都在x:\Python xx\Scripts路径下。 拖动pip主应用程序到命令行窗口。 输入“install 模块/包名”&#xff…

Ubuntu22.04之VirtualBox7.0.18安装Win10无法启用增强功能问题(二百六十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

优盘驱动器未格式化:数据拯救行动指南

优盘困境&#xff1a;驱动器未格式化的挑战 在日常的数据存储与传输中&#xff0c;优盘以其便携性和高容量成为了我们不可或缺的伙伴。然而&#xff0c;当您尝试访问优盘时&#xff0c;突然弹出的“驱动器未被格式化”提示却如同晴天霹雳&#xff0c;让人措手不及。这一状况不…

AI写作|告诉你CoT的几个简单步骤,使用后大幅提升AI的推理能力

随着对 AI 不断了解&#xff0c;我深切体会到一个高效的提示词有多重要。希望这篇能给不会写高效提示词的朋友一些思路&#xff0c;让你能更顺手地使用 AI。 什么是思考链 (CoT) 思考链&#xff08;Chain of Thought&#xff0c;简称 CoT&#xff09;是一种推理策略&#xff0c…

Git代码冲突怎么处理?

我们在使用Git时难免会出现代码冲突的问题&#xff0c;出现冲突的原因是因为当本地文件的版本与目标分支中文件的版本不一致时当存在同一行的内容不同时在进行合并时会出现冲突。 代码冲突一般发生在以下情况: 1、多个分支向主分支合并时 2、同一个分支下pull或push操作时。 为…

python 可视化探索(四):电商数据可视化案例

总结&#xff1a;本文为和鲸python 可视化探索训练营资料整理而来&#xff0c;加入了自己的理解&#xff08;by GPT4o&#xff09; 注意跟练题目3中提到的多种数据替换方式&#xff0c;非常值得学习&#xff01;&#xff01; 原作者&#xff1a;作者&#xff1a;大话数据分析…

【人工智能专栏】Focal Loss 可以平衡简单样本和困难样本(或大量样本和少量样本)的学习

Focal Loss 理念 Focal loss 可以 平衡简单样本和困难样本(或大量样本和少量样本)的学习 。在遇到样本不同类别之间学习难度相差很大(比如区分飞机、摩托车和自行车,飞机的特征明显与后两者更易区分,可以用混淆矩阵看出来),或者样本数量相差很多时(飞机有 1k 个样本,…

智联招聘岗位数据采集攻略:五步走,轻松搞定职位信息

摘要&#xff1a; 本文将手把手教你利用Python编写一个轻量级的智联招聘岗位信息采集器&#xff0c;无需复杂工具&#xff0c;仅需五步&#xff0c;即可实现高效职位信息抓取。通过实战演练&#xff0c;你将掌握网络爬虫基础、请求处理、解析技术及数据清洗技巧&#xff0c;助…

【29】Android之学习native开发(一)

一、概述 没什么好讲的了&#xff0c;Android学习成长过程必经之路就是了解Framework层的源码及原理&#xff0c;在跟踪流程过程中&#xff0c;难免遇到很多natvie函数&#xff0c;这个时候学习native能帮助我们更轻松的读懂这方便的代码。 这篇文章也会从最基础的东西开始讲…

Towards Self-supervised Learning on Graphs with Heterophily

推荐指数: #paper/⭐ 发表于: CIKM22 一句话总结:本文通过重构相似性矩阵来生成两种特征增强方法.通过对比学习来进行训练.值得一题的一点是他在对比学习中,用了X得到的特征和AX的对比.还是有一丢丢创新性的 主要工作: 图增强 特征相似矩阵 S ~ i j F cos ⁡ ( x i , x j )…

数据结构与算法--队列

文章目录 提要队列的定义队列的认识队列的应用队列的抽象数据类型队列的存储结构队列的链式存储结构与实现链队的进队和出队操作链队的数据类型初始化链队列入队操作出队操作队列的顺序存储结构与实现顺序队列的假溢出问题队列上溢循环队列循环队列取下一相邻单元下标运算队满与…

U盘数据丢失?一招教你如何使用四种技巧轻松找回!

每一个打工人可能都是被各种文件所困扰的&#xff0c;而且现在不仅仅是工作上&#xff0c;还有学习以及日常的生活记录也需要接触到各类的数据&#xff0c;拿我们平时用软件时产生的文件、图片、视频等等来说&#xff0c;就占据了磁盘的大部分空间&#xff0c;当然有时候也会选…

让玄学可靠:构建复杂 LLM 应用

ChatGPT 从 2023 年一月份爆火&#xff0c;到了六月份热度下降&#xff0c;大量的 Chat 应用昙花一现&#xff0c;很多人又开始讨论——大模型到底能解决什么问题&#xff1f;过去太多的焦点给到了 ChatGPT&#xff0c;让大家以为 AI ChatGPT&#xff0c;而忽略了背后的 LLM。…

作业练习1

要求&#xff1a;R1-R2-R3-R4-R5 RIP 100 运行版本2 R6-R7 RIP 200 运行版本1 1.使用合理IP地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条目数量&#xff0c;R1-R2之间增加路由传递…

vLLM初识(一)

vLLM初识&#xff08;一&#xff09; 前言 在LLM推理优化——KV Cache篇&#xff08;百倍提速&#xff09;中&#xff0c;我们已经介绍了KV Cache技术的原理&#xff0c;从中我们可以知道&#xff0c;KV Cache本质是空间换时间的技术&#xff0c;对于大型模型和长序列&#xf…

MyBatis动态代理和映射器

目录 1、映射器简介 &#xff08;1&#xff09;什么是mapper动态代理&#xff1f; &#xff08;2&#xff09;动态代理的规范 &#xff08;3&#xff09;如何使用动态代理 &#xff08;4&#xff09;为什么学映射器 &#xff08;5&#xff09;映射器与接口 &#xff08;…

动手学深度学习V2每日笔记(卷积层)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1L64y1m7Nh/p2&spm_id_from333.1007.top_right_bar_window_history.content.click&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不…

3.OpenFeign与负载均衡

文章目录 什么是 OpenFegin0penFeign 与 Ribbon.对 consumer 的改造超时配置请求响应的压缩设置选择远程调用的底层实现技术OpenFegin 整合 LoadBalancer 负载均衡负载均衡策略的更换小结 前面消费者对于微服务的消费是通过 RestTemplate 完成的,这种方式的弊端是很明显的:消费…