Qt:4.信号和槽

目录

1.信号源、信号和槽:

2.Qt类的继承关系:

3.自定义槽函数:

4.第一种信号和槽的连接的方法:

5.第二种信号和槽的连接的方法:

6.自定义信号:

 7.发射信号:

8.信号和槽的传参:

9.信号和槽的意义:

10.断开信号和槽的连接:

11.槽函数和lambda表达式:


1.信号源、信号和槽:

  • 信号源(Sender):发出信号的对象。
  • 信号(Signal):由对象发出,用于通知某个事件的发生。用户进行不同的个操作,会触发不同的信号,比如点击按钮,勾选选择框等
  • 槽(Slot):一个函数,可以连接到信号。当信号发出时,连接到该信号的槽会被调用

2.Qt类的继承关系:

  • QObject 是所有Qt对象的基类,提供信号槽、事件处理等基础功能。
  • QWidget 是所有用户界面对象的基类,继承自 QObject,提供窗口部件的绘制、事件处理等功能。
  • 各种小控件(如 QPushButton, QLabel, QLineEdit 等)都继承自 QWidget,从而拥有用户界面的功能。

3.自定义槽函数:

  • 槽函数的有两种定义方式:
  • 第一种:先在widget对象中声明,然后在.cpp文件中定义。
  • 第二种:使用拖拽的方式创建控件,创建好后在ui界面,右键点击要添加槽函数的控件,会出现一个菜单,选择转到槽,就能够看到可以定义的所有槽函数,选择之后,会自动生成槽函数的声明和定义的框架。
  • 第一种方法自定义的槽函数,要使用connect手动进行连接信号,但是第二种自动生成槽函数,我们发现头文件和槽函数源文件中都没有生成connect连接。

4.第一种信号和槽的连接的方法:

  • 要使信号和槽连接起来。通常使用QObject::connect函数进行连接:
  • 旧版本的conncect函数,格式为:
    connect(const QObject *sender, 
            const char *signal, 
            const QObject *receiver, 
            const char *method,
            Qt::ConnectionType type = Qt::AutoConnection);
  • 其中的前四个参数分别代表:发出信号的对象、信号的类型的函数指针、接收信号并执行槽函数的对象、槽函数的函数指针。
  • 旧版本的connect函数,传参时,需要将函数指针转换为char*类型,需要用到两个宏函数:SIGNAL和SIGNAL,来分别将connect的第二和第四个参数转换为char*类型。
  • 从Qt5开始,使用了模板进行泛型编程,就可以不在使用两个宏来转换指针类型,可以直接传递函数指针了。

5.第二种信号和槽的连接的方法:

  • 利用特定的命名规则来命名槽函数,自动连接信号和槽。
  • 因为通过拖拽的方式生成的每一个控件都有唯一的objectname,通过这个唯一的objectname以一定的格式,来命名槽函数,就可以建立信号和槽之间的关联。具体的命名规则如下:
void on_<object name>_<signal name>(<signal parameters>);
  • <object name> 是发出信号的对象的名称(对象的 objectName 属性)。<signal name> 是信号的名称。
  • 例如,如果有一个按钮对象,其 objectName 是 myButton,并且要自动连接它的 clicked() 信号到某个槽函数,那么槽函数的名称应为:void on_myButton_clicked();
  • 当有槽函数的名称符合上述命名规则,qt就会触发自动连接信号和槽的规则。
  • 如果通过拖拽的方式创建控件,建议使用自动连接信号和槽。
  • 如果手动创建控件,还是使用connect建立连接。
  • Qt 的自动连接机制主要通过 connectSlotsByName 函数实现。这个函数会根据对象的 objectName 属性和槽函数的名称进行匹配,从而自动连接信号和槽。也可以在手动调用该函数的情况下,不使用connect。

6.自定义信号:

  • 用户可以进行的操作,是可以穷举的,Qt的内置信号基本可以覆盖用户的所有可能的操作。所以很少会用到自定义信号。
  • 在 Qt 中,自定义信号是一个没有函数体的函数声明。程序员只需声明信号即可,这个函数的定义是由 Qt 在编译过程中自动生成的,程序员无法干预信号函数的具体实现。
  • 信号函数的返回值必须是void。信号函数可以有参数,也可以没有参数。支持函数重载。
  • 声明信号,要加上signal,就像声明一个函数为public一样,当Qt扫描到signal时,就会默认下面的函数声明当作信号,并且给这些信号函数自动生成函数的定义。
signals:
    void customSignal(int value);  // 自定义信号

 7.发射信号:

  • Qt的内置信号,无需手动触发,但是自定义信号,需要手动触发。
  • 发射信号需要使用emit关键字,emit+信号函数的调用就可以实现信号的发送。
  • 比如一个叫mySignal的自定义信号,要发送这个信号就可以:emit mySignal();
  • 在Qt5中,不写emit直接调用信号函数也可以发送信号,但是加上emit可以提高代码的可读性。还是加上吧。

8.信号和槽的传参:

  • 信号和槽,都可以带参数,当信号带有参数时,槽的参数必须和信号的参数一致。
  • 当带参的信号被发送出去,被对应的槽函数接收后,就能够达到让信号给槽传参的效果了。
  • 信号和槽的参数数量可以不一致,但是类型必须一致,要求信号的参数大于等于槽的参数数量。
  • 在Qt中,如果想要一个类能够使用信号槽,就需要在类的开始加上Q_Object。

        

9.信号和槽的意义:

  • 信号和槽要解决的问题,就是响应用户的操作。
  • Qt搞一个单独的connect完成信号和槽的连接,有两点设想,其一是把控件和用户逻辑解耦合,其二是实现多对多的效果,可以一个信号绑定多个槽,也可以一个槽绑定多个信号。
  • 实际上,多对多是一个伪需求,实际开发中一对一就足够使用了。

10.断开信号和槽的连接:

  • 使用disconnect可以断开信号和槽的连接,使用方法和connect非常相似,一般来说很少主动断开,当要将信号重新绑定到另一个槽上时,才会用到断开。
  • 传递参数和connect一样。

11.槽函数和lambda表达式:

  • 在 Qt 中,可以使用 lambda 表达式来定义和连接槽函数。使用 lambda 表达式作为槽函数的好处是可以直接在 connect 调用中编写逻辑,避免为简单的操作单独定义槽函数。类似于匿名函数。
  • connect的第四个参数,是由三组括号构成:[ ]( ){ }。
  • 第一对括号可以用于变量捕获,Lambda 表达式的变量捕获机制允许在 lambda 表达式内部访问外部作用域中的变量。
 connect(button, &QPushButton::clicked, this, [this, count]() mutable {count++;});
  • 第二对括号,传递参数;第三对括号,实现逻辑。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第7章_低成本 Modbus 传感器的实现

文章目录 第7章 低成本 Modbus 传感器的实现7.1 硬件资源介绍与接线7.2 开发环境搭建7.3 创建与体验第 1 个工程7.3.1 创建工程7.3.2 配置调试器7.3.3 配置 GPIO 操作 LED 7.4 UART 编程7.4.1 使用 STM32CubeMX 进行配置1.UART12.配置 RS485方向引脚 7.4.2 封装 UART7.4.3 上机…

已解决javax.security.auth.login.LoginException:登录失败的正确解决方法,亲测有效!!!

已解决javax.security.auth.login.LoginException&#xff1a;登录失败的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 1. 检查用户名和密码 用户名和密码验证 2. 验证配置文件 …

前端面试题(基础篇十二)

一、link标签定义、与import的区别 link 标签定义文档与外部资源的关系。 link 元素是空元素&#xff0c;它仅包含属性。 此元素只能存在于 head 部分&#xff0c;不过它可出现任意数。 link 标签中的 rel 属性定义了当前文档与被链接文档之间的关系。常见的 stylesheet 指的是…

ServletConfig与ServletContext详解

文章目录 概要web.xmlServletConfig介绍ServletConfig实例ServletConfig细节ServletContext介绍ServletContext实例ServletContext细节ServletContext获得服务访问次数&#xff08;可拓展&#xff09;总结 概要 web.xml <?xml version"1.0" encoding"UTF-…

使用uniapp编写微信小程序

使用uniapp编写微信小程序 文章目录 使用uniapp编写微信小程序前言一、项目搭建1.1 创建项目方式1.1.1 HBuilderX工具创建1.1.2 命令行下载1.1.3 直接Gitee下载 1.2 项目文件解构1.2.1 安装依赖1.2.2 项目启动1.2.3 文件结构释义 1.2 引入uni-ui介绍 二、拓展2.1 uni-app使用uc…

谷粒商城实战(045集群学习-elasticsearch(ES)集群)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第368p-第p369的内容 文章目录 简介集群健康分片新增节点水平扩容问题和解决集群结构测试集群信息 简介 不管用户发给哪个节点&#xff0c;都可以…

Adobe Acrobat Pro或者Adobe Acrobat Reader取消多标签页显示,设置打开一个pdf文件对应一个窗口。

Windows系统&#xff1a;Adobe Acrobat Pro或者Adobe Acrobat Reader首选项-一般-取消在同一窗口的新标签中打开文档&#xff08;需要重启&#xff09;的对勾&#xff0c;点击确定&#xff0c;彻底关闭后重启&#xff0c;这样打开的每一个PDF文件对应的是一个窗口&#xff0c;并…

vue3+ el-upload封装上传组件

组件功能介绍 上传格式限制上传大小限制上传文件数量限制自定义上传区上传成功回调禁用上传开关与点击上传自定义事件暴露所以上传文件列表&#xff08;uploadList&#xff09;与当前文件数据&#xff08;uploadLatestFile&#xff09; 组件代码Upload.vue <template>&l…

玩具租赁系统(安装+讲解+源码)

技术栈: 后端: SpringBoot Mysql MybatisPlus 前端: Vue Element 分为 管理员端 用户端 功能: 用户端 管理员端 观看地址: B站搜&#xff1a; 【毕设者】玩具租赁系统(安装讲解源码)

智慧园区综合平台解决方案PPT(75页)

## 智慧园区的理解 ### 从园区1.0到园区4.0的演进 1. 园区1.0&#xff1a;以土地经营为主&#xff0c;成本驱动&#xff0c;提供基本服务。 2. 园区2.0&#xff1a;服务驱动&#xff0c;关注企业成长&#xff0c;提供增值服务。 3. 园区3.0&#xff1a;智慧型园区&#xff…

WordPress免费模板:惊艳动态效果,打造视觉盛宴

WordPress免费模板&#xff1a;惊艳动态效果&#xff0c;打造视觉盛宴 我们为您带来了一款独具特色的WordPress免费模板&#xff0c;这款模板以其独特的动态效果设计&#xff0c;特别是引人注目的动态banner图片效果&#xff0c;为您的网站注入活力&#xff0c;打造一场视觉盛…

[渗透测试] 任意文件读取漏洞

任意文件读取漏洞 概述 漏洞成因 存在读取文件的功能&#xff08;Web应用开放了文件读取功能&#xff09;读取文件的路径客户端可控&#xff08;完全控制或者影响文件路径&#xff09;没有对文件路径进行校验或者校验不严格导致被绕过输出文件内容 漏洞危害 下载服务器中的…

spring boot (shiro)+ websocket测试连接不上的简单检测处理

1、用前端连接测试的demo一切正常&#xff0c;但是到了项目中连接不上了 一开始以为是地址错&#xff0c;但是换了apifox测试也是不可以。 2、考虑是shiro进行了拦截了&#xff0c;所以就访问不到了地址&#xff0c;那么就放行。 3、再次用apifox测试&#xff0c;成功了。 当然…

【CSS in Depth 2 精译】2.2 em 和 rem + 2.2.1 使用 em 定义字号

当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力 2.1.1 响应式设计的兴起 2.2 em 与 rem ✔️ 2.2.1 使用 em 定义字号 ✔️2.2.2 使用 rem 设置字号 2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 2.…

复分析——第9章——椭圆函数导论(E.M. Stein R. Shakarchi)

第 9 章 椭圆函数导论 (An Introduction to Elliptic Functions) The form that Jacobi had given to the theory of elliptic functions was far from perfection; its flaws are obvious. At the base we find three fundamental functions sn, cn and dn. These functio…

一文解决图论中有向图、无向图、非负加权图的单源最短路径问题【超详细】【通用模板程序】【深入分析】【无需基础】【c++】

本文致力于提供一种解决图论中所有&#xff08;或绝大部分&#xff09;有向图、无向图、非负加权图的单源最短路径问题的通用程序模板&#xff0c;本文提供的模板并不是简单的可行模板&#xff0c;而是经过深入分析解释的一个较高质量和性能的通用程序模版。在每个关键变量存储…

JavaSE期末复习速成笔记

面向对象 1. 面向对象的概念 面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它将现实世界的事物抽象为对象&#xff0c;通过类和对象来创建各种功能模块&#xff0c;以此来设计和开发软件。 2. 类与对象 类&#xff1a;是对象的模板&#xff0c;定义了…

Ros2学习中的话题通信-自定义接口消息:在VScode中不能补全的问题

在学习ros2的过程中&#xff0c;当学习到话题通信-自定义接口消息时&#xff0c;当消息的具体类型并未指定时&#xff0c;常见的操作是在base_interfaces_demo下创建msg文件夹及文件。同理&#xff0c;在动作通信等其他类型的通信中也需要这么做&#xff0c;只是创建的文件夹的…

KV260视觉AI套件--开箱报告

目录 1. 简介 2. 与 Zynq 的渊源 3. 官方的入门步骤 4. 总结 1. 简介 传统的ARMFPGA或DSPFPGA控制方案在软件、逻辑、硬件以及系统工程的协同调试中&#xff0c;往往需要团队成员之间严格按照预定计划和接口规范进行分工合作&#xff0c;这不仅增加了测试过程的复杂性&…

【ElementPlus源码】Container 布局容器

文章目录 index.tsContainerheaderutilswithInstallwithNoopInstall hooksuseNamespace 单元测试 看源码时候做的笔记。如有错误请指出&#xff01; 关于路径的省略&#xff0c;详见button&#xff1a;【ElementPlus源码】Button按钮-CSDN博客 index.ts 导入一堆组件&#xff…