[Qt][信号与槽][上]详细讲解

news2024/11/16 19:35:26

目录

  • 0.Q_OBJECT宏
  • 1.信号和槽概述
    • 1.信号
    • 2.槽
    • 3.说明
  • 2.信号和槽的使用
    • 1.连接信号和槽
    • 2.查看内置信号和槽

0.Q_OBJECT宏

  • Qt如果要让某个类能够使用信号槽,则必须要在类最开始的地方,写下Q_OBJECT

1.信号和槽概述

1.信号

  • 在Qt中,⽤⼾和控件的每次交互过程称为⼀个事件
    • 例如:"⽤⼾点击按钮"是⼀个事件,"⽤⼾关闭窗⼝"也是⼀个事件
  • 每个事件都会发出⼀个信号
    • 例如:⽤⼾点击按钮会发出"按钮被点击"的信号,⽤⼾关闭窗⼝会发出"窗⼝被关闭"的信号
  • 信号的本质
    • 信号是由于⽤⼾对窗⼝或控件进⾏了某些操作,导致窗⼝或控件产⽣了某个特定事件,这时Qt对应的窗⼝类会发出某个信号,以此对⽤⼾的操作做出反应
    • 因此,信号的本质就是事件
  • Qt中信号是通过什么形式呈现给使⽤者的呢?
    • 对哪个窗⼝进⾏操作,哪个窗⼝就可以捕捉到这些被触发的事件
    • 对于使⽤者来说,触发了⼀个事件就可以得到Qt框架发出的某个特定信号
    • 信号的呈现形式就是函数
      • 也就是说某个事件产⽣了,Qt框架就会调⽤某个对应的信号函数,通知使⽤者
  • 在Qt中信号的发出者是某个实例化的类对象

2.槽

  • Qt中的**所有控件都具有接收信号的能⼒,⼀个控件还可以接收多个不同的信号**

  • 对于接收到的每个信号,控件都会做出相应的响应动作

    • 按钮所在的窗⼝接收到"按钮被点击"的信号后,会做出"关闭⾃⼰"的响应动作
    • 输⼊框⾃⼰接收到"输⼊框被点击"的信号后,会做出"显⽰闪烁的光标,等待⽤⼾输⼊数据"的响应动作
  • 在Qt中,对信号做出的响应动作就称之为槽

  • 信号和槽是Qt特有的消息传输机制,它能将相互独⽴的控件关联起来

    • 例如:“按钮"和"窗⼝” 本⾝是两个独⽴的控件,点击"按钮"并不会对"窗⼝"造成任何影响。通过信号和槽机制,可以将"按钮"和"窗⼝"关联起来,实现"点击按钮会使窗⼝关闭"的效果
      请添加图片描述
  • 槽的本质

    • 槽(Slot)就是对信号响应的函数
    • 槽就是⼀个函数,与⼀般的C++成员函数是⼀样的
      • 可以定义在类的任何位置(public, protected, private)
      • 可以具有任何参数
      • 可以被重载
      • 也可以被直接调⽤(但是不能有默认参数)
    • 槽函数与⼀般的函数不同的是槽函数可以与⼀个信号关联,当信号被发射时,关联的槽函数被⾃动执⾏

3.说明

  • 信号和槽机制底层是通过函数间的相互调⽤实现的
    • 每个信号都可以⽤函数来表⽰,称为信号函数
    • 每个槽也可以⽤函数表⽰,称为槽函数
    • 例如
      • "按钮被按下"这个信号可以⽤clicked()表⽰,"窗⼝关闭"这个槽可以⽤close()表⽰,
      • 假如使⽤信号和槽机制实现:"点击按钮会关闭窗⼝"的功能,其实就是clicked()调⽤close()的效果
  • 信号函数和槽函数通常位于某个类中,和普通的成员函数相⽐,它们的特别之处在于
    • 信号函数⽤signals关键字修饰
    • 槽函数⽤public slots, protected slots, private slots修饰
    • signalsslots是Qt在C++的基础上扩展的关键字,专⻔⽤来指明信号函数和槽函数
  • 信号函数只需要声明,不需要定义(实现),⽽槽函数需要定义(实现)
    • 信号函数的定义是Qt⾃动在编译程序之前⽣成的,编写Qt应⽤程序的程序员⽆需关注
    • 这种⾃动⽣成代码的机制称为元编程(MetaProgramming)

2.信号和槽的使用

1.连接信号和槽

  • QObject类提供了⼀个静态成员函数connect(),专⻔⽤来关联指定的信号函数和槽函数
  • 函数原型
    connect(const QObject* sender, 
    		const char* signal, 
    		const QObject* receiver, 
    		const char* method,
    		Qt::ConnectionType type = Qt::AutoConnection)
    
  • 参数
    • sender:信号的发送者 -> 当前信号由哪个空间发出
    • signal:发送的信号(信号函数)
      • 要求和sender必须是匹配的
      • :如果senderQPushButton*,那么signal必须是QPushButton内置的信号(父类的信号),不能是其他类的信号
    • receiver:信号的接收者 --> 哪个对象负责处理
    • method:接收信号的槽函数 --> 这个对象该怎么处理
    • type:⽤于指定关联⽅式,默认的关联⽅式为Qt::AutoConnection通常不需要⼿动设定
  • 疑问:为什么signalmethod类型是char*
    • 这个函数声明,是旧版本的Qt的connect的函数声明
      • 此时使用要搭配SIGNALSLOT使用
      • 例如connect(button, SIGNAL(&QPushButton::clicked), this, SLOT(&Widget::close));
    • Qt5开始,对上述写法做出了简化,不再需要SIGNALSLOT了,提供了connect的重载版本,该版本中,signalmethod成了泛型参数,允许传入任意类型的指针了
      template <typename Func1, typename Func2>
      static inline QMetaObject::Connection
      connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, 
              Func1 signal,
              const typename QtPrivate::ContextTypeForFunctor<Func2>::ContextType *context, 			
              Func2 &&slot,
              Qt::ConnectionType type = Qt::AutoConnection)
      

2.查看内置信号和槽

  • 系统⾃带的信号和槽通常是通过"Qt帮助⽂档"来查询
  • 如果没有找到,可以继续去⽗类中查找

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

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

相关文章

如何在银河麒麟操作系统上搭建 Electron (含 Electron 打包指南)

本次教程所用版本 QT版本&#xff1a;5.12 Eletron版本&#xff1a;31.3.1 Electron-packager版本&#xff1a;17.1.2 VScode版本&#xff1a;1.92.0 Node版本&#xff1a;18.19.0 npm版本&#xff1a;10.2.3 前言&#xff1a; 随着跨平台应用开发的需求日益增长&#…

Python基础核心知识点(建议收藏再用)

目录 一、python入门day1-day24 day01-03 编程语言day04 变量day05 垃圾回收机制&#xff08;GC机制&#xff09; 1 引用计数2 标记清除3 分代回收 day05 程序交互与基本运算符day06 可变不可变类型day07 流程控制 1 赋值 2 浅拷贝 copy3 深拷贝 deepcopy day08-10 基本数据类…

ES数据类型学习之keyword和text以及查询条件match和term

es&#xff08;4&#xff09;—查询条件match和term_es match term-CSDN博客 参考文章如上。开始学习 1.text和keyword的学习 直接上官网Text type family | Elasticsearch Guide [7.17] | Elastic Text type family The text family includes the following field types: …

默克索引轻松搞定,快速查找!

在化学、药学和生物科学领域&#xff0c;有一部被广泛认可的权威工具书——《默克索引》&#xff08;Merck Index&#xff09;。自1889年首次出版以来有130多年的历史&#xff0c;《默克索引》一直被视为化学品、药物和生物制品的关键物理、药理和历史信息的最权威、最可靠的来…

Ubuntu22.04安装NVIDIA Driver和CUDA

Ubuntu22.04安装NVIDIA Driver和CUDA 1.安装NVIDIA Driver(1).卸载Ubuntu自带的驱动程序&#xff1a;(2).禁用nouveau:(3).安装相应的NVIDIA Driver: 2.安装CUDA(1).下载并安装CUDA:(2).配置环境变量&#xff1a; 本文记录了在 "Ubuntu22.04"上安装 "NVIDIA D…

百度关掉Ai智能回答(保姆级技术文,解决过程完整记录)

随着AI时代到来&#xff0c;百度也是不肯落于人后&#xff0c;在其搜索页面推出了AI自动回答。点到这里的你想必正因此懊恼&#xff0c;你说它怎么切入不好&#xff0c;非得搞个东西在那一直跳&#xff0c;顶着下面的内容哐哐直跳&#xff0c;你想好好浏览内容还得等它跳消停了…

C++(week15): C++提高:(四)并发服务器架构模型

文章目录 一、五种网络IO模型1.数据传输过程2.两组重要概念3.五种网络IO模型(1)阻塞式IO(2)非阻塞式IO(3)IO多路复用(4)信号驱动IO(5)异步IO 4.五种网络IO模型的对比5.举例说明 二、并发服务器模型1.循环式迭代式模式2.并发式服务器3.prefork服务器4.反应式服务器 (Reactor)5.反…

协同过滤推荐算法(包括传统协同过滤、矩阵分解、NeuralCF)

一、什么是协同过滤推荐算法 传统的协同过滤&#xff08;Collaborative Filtering, CF&#xff09;是一种推荐系统技术&#xff0c;它基于用户的历史行为数据来预测用户对未评分项目的潜在兴趣。 “协同大家的反馈、评价和意见一起对海量的信息进行过滤&#xff0c;从中筛选出…

IPD如何通过数字化项目管理平台落地实施?

随着市场竞争的日益激烈&#xff0c;企业对于产品研发的效率和质量逐渐提高&#xff0c;越来越多的企业关注到IPD(Integrated Product Development)&#xff0c;希望参考IPD体系的方法理念和实践经验&#xff0c;从而帮助企业快速响应市场变化、缩短产品开发周期、提升产品开发…

step9:设置软件初始状态获取时不发送配置指令

文章目录 文章介绍问题描述效果图 解决办法下拉框控件ComboBox切换开关组件Switch数值微调框控件SpinBox 文章介绍 问题描述 虚拟端口&#xff08;硬件&#xff09;发送信号给客户端电脑&#xff0c;会设置此时硬件的各种基础参数&#xff0c; 客户端软件被设置基础参数之后&a…

计算机视觉——凸包计算

现在有一大堆点&#xff0c;然后你要找出一个可以围住这些点且面积最小的凸多边形&#xff0c;这个凸多边形称为凸包。 显而易见&#xff0c;如果要面积最小&#xff0c;那凸包的顶点势必得是这一大堆点的几个点&#xff0c;你也可以想成是用一条橡皮筋把这些点圈起来。 先把各…

什么是云原生?(一)

1. 前言 停下手头的工作&#xff0c;让你的同事定义“云原生”一词。你很可能会得到几个不同的答案。 1.1 让我们从一个简单的定义开始&#xff1a; 云原生架构和技术是一种设计、构建和操作在云中构建并充分利用云计算模型的工作负载的方法。 1.2 云原生计算基金会给出了官方…

easyexcel使用教程--导入导出简单案例

java中操作excel的库是poi,但是poi有很多问题&#xff0c;使用复杂&#xff0c;内存占用大等&#xff0c;阿里开源了一个操作excel的库叫easyexcel,它基于poi做了很多优化&#xff0c;平时读写excel建议使用这个库 文档地址: 关于Easyexcel | Easy Excel 官网 写入excel 在…

操作无法完成错误0x000006ba?教你几种全面解析与解决方案指南

错误代码0x000006ba通常与 Windows 操作系统中的远程过程调用&#xff08;RPC&#xff09;服务有关。当你在尝试执行某些操作&#xff0c;如连接到网络共享、运行某些网络服务或使用依赖于 RPC 的应用程序时&#xff0c;可能会遇到这个错误。接下来就和大家聊聊操作无法完成错误…

“揭秘CentosChina爬虫项目:掌握Scrapy框架的必备技巧与数据库设计“

Centoschina 项目要求 爬取centoschina_cn的所有问题&#xff0c;包括文章标题和内容 数据库表设计 库表设计&#xff1a; 数据展示&#xff1a; 项目亮点 低耦合&#xff0c;高内聚。 爬虫专有settings custom_settings custom_settings_for_centoschina_cncustom_settin…

鸿蒙(API 12 Beta2版)媒体开发【使用OHAudio开发音频播放功能(C/C++)】

OHAudio是系统在API version 10中引入的一套C API&#xff0c;此API在设计上实现归一&#xff0c;同时支持普通音频通路和低时延通路。仅支持PCM格式&#xff0c;适用于依赖Native层实现音频输出功能的场景。 使用入门 开发者要使用OHAudio提供的播放或者录制能力&#xff0c…

根据 IP 地址配置子网示例(下挂 hub 接不同 vlan 终端)

我们一般根据端口配置子网比较简单&#xff0c;但是如果换接口&#xff0c;就又要到交换机上重新配置端口所属 vlan 了&#xff0c;紧急情况下&#xff0c;还是比较耽误时间的。但如果根据IP地址配置 vlan&#xff0c;则可以插在交换机上任意端口&#xff0c;排障时比较节省时间…

部分PC制造商不会帮助英特尔第13/14代酷睿延保 对用户来说可能是个问题

早前英特尔已经宣布大部分第 13/14 代酷睿桌面处理器将可以获得延长保修服务&#xff0c;即后续使用出现非人为损坏的问题后&#xff0c;用户都可以联系英特尔换一颗新处理器。然而英特尔承担责任不代表对用户来说就高枕无忧&#xff0c;例如只有盒装版处理器才能直接联系英特尔…

MySQL数据库分区

文章目录 1. 分区的基本概念2. 分区的类型3. 在 MySQL 中实现分区3.1 创建分区表3.2 插入数据3.3 查询数据3.4 修改分区3.5 查看分区信息 4. 具体示例4.1 范围分区 (Range Partitioning)4.2 列表分区 (List Partitioning)4.3 哈希分区 (Hash Partitioning)4.4 键分区 (Key Part…

Win32注册表操作

注册表的概念 注册表是一个存储计算机配置信息的数据库&#xff0c;用于存储计算机上的硬件、安装的软件、系统设置以及用户账户配置等重要信息。对注册表的编辑不当可能会影响计算机的正常运行。应用程序可以调用API函数来对注册表进行增、删等操作。 注册表结构 运行Regedi…