06.QT信号和槽-1

一、信号和槽概述

        在Qt中,用户和控件的每次交互过程称为一个事件。比如"用户点击按钮"是一个事件,"用户关闭窗口"也是一个事件。每个事件都会发出一个信号,例如用户点击按钮会发出"按钮被点击"的信号,用户关闭窗口会发出"窗口被关闭"的信号。
        Qt中的所有控件都具有接收信号的能力,一个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。例如,关闭按钮所在的窗口接收到"按钮被点击"的信号后,会做出"关闭自己"的响应动作;再比如输入框自己接收到"输入框被点击"的信号后,会做出"显示闪烁的光标,等待用户输入数据"的响应动作。在Qt中,对信号做出的响应动作就称之为槽
        信号和槽是Qt特有的消息传输机制,它能将相互独立的控件关联起来。比如,"按钮"和"窗口"本身是两个独立的控件,点击"按钮"并不会对"窗口"造成任何影响。通过信号和槽机制,可以将"按钮"和"窗口"关联起来,实现"点击按钮会使窗口关闭"的效果。

二、信号和槽的本质

1.信号的本质

        信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时Qt对应的窗口类会发出某个信号,以此对用户的操作做出反应。因此,信号的本质就是事件。例如:按钮单击、双击;窗口刷新;鼠标移动、按下、释放;键盘输入……

注意:

(1)我们对哪个窗口进行操作,哪个窗口就可以捕捉到这些被触发的事件。
(2)对于使用者来说触发了一个事件我们就可以得到Qt框架给我们发出的某个特定信号。
(3)信号的呈现形式就是函数,也就是说某个事件产生了,Qt框架就会调用某个对应的信号函数,通知使用者。
(4)在Qt中信号的发出者是某个实例化的类对象。

2.槽的本质

        槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何位置( public、protected或private),可以具有任何参数,可以被重载,也可以被直接调用(但是不能有默认参数)。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。
注意:

(1)信号和槽机制底层是通过函数间的相互调用实现的。每个信号都可以用函数来表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。例如:"按钮被按下"这个信号可以用clicked()函数表示,"窗口关闭"这个槽可以用close()函数表示,假如使用信号和槽机制-实现:"点击按钮会关闭窗口”的功能,其实就是clicked()函数调用close()函数的效果。

(2)信号函数和槽函数通常位于某个类中,和普通的成员函数相比,它们的特别之处在于:

        ①信号函数用signals关键字修饰,槽函数用public slots、protected slots或者private slots修饰。signals和slots是Qt在C++的基础上扩展的关键字,专门用来指明信号函数和槽函数;

        ②信号函数只需要声明,不需要定义(实现),而槽函数需要定义(实现)。

        信号函数的定义是Qt自动在编译程序之前生成的,编写Qt应用程序的程序猿无需关注。这种自动生成代码的机制称为元编程(Meta Programming),这种操作在很多场景中都能见到。

三、信号和槽的使用

1.连接信号和槽connect

        在Qt中,QObject类提供了⼀个静态成员函数connect(),该函数专⻔⽤来关联指定的信号函数和槽函数。

QObject类:

        QObject类是Qt内置的父类,Qt中提供的很多类都是直接或者间接继承自QObject类。

connect()函数原型:

connect (const QObject *sender,const char * signal ,const QObject * receiver ,const char * method ,Qt::ConnectionType type = Qt::AutoConnection )

connect()函数参数说明:

  • sender:信号的发送者;
  • signal:发送的信号(信号函数);
  • receiver:信号的接收者;
  • method:接收信号的槽函数;
  • type:用于指定关联方式,默认为AutoConnection;

代码示例:在窗口中添加一个按钮,点击按钮时窗口关闭

2.查看内置信号和槽

        系统内置的信号和槽,通常都是通过官方QT帮助文档来查询,例如查询按钮的信号:

(1)在帮助文档中输入QPushButton来进行搜索

(2)结果发现并没有找到有关信号的内容,那么继续搜索其父类QAbstractButton中进行寻找

(3)其中就能找到Signals相关内容,同理如果父类中没有找到相关信息,可以继续向父类的父类一直向上寻找

3.连接信号与槽方式

3.1通过connect手动连接

        我们也可以去定义一个自己的槽函数来完成自己想要的操作,然后通过connect函数将对应控件的对应信号与槽函数进行绑定即可。

3.2 通过命名规则自动连接

        ①右键控件,选择转到槽,会自动弹出窗口显示可以选择的信号:

        

        ②选择对应的信号后,会自动跳转到代码编辑页面,且已自动创建好槽函数:

        我们此时只需要直接在函数中,编写我们所需要的实现即可。

        此时可能会发现没有connect函数进行绑定,但却能实现对应操作,是因为QT还可以通过函数名进行自动绑定槽函数,只需要我们在定义槽函数名时,满足自动绑定的规则即可。

槽函数的命名规则为 on_XXX_SSS :
1、以"on"开头,中间使⽤下划线连接起来;
2、"XXX"表⽰的是对象名(控件的objectName属性);
3、"SSS"表⽰的是对应的信号。
例如:"on_pushButton_clicked()",pushButton代表的是对象名,clicked是对应的信号

注意事项:

1.如果是代码手动实现,更建议显示的使用connect进行连接,不要依赖命名规则自动连接

2.如果是ui布局使用,根据实际运用情况对功能没有影响的情况下,可以选择自动连接方式

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

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

相关文章

Java练习(第5天)【总结】在字符串中寻找特定的字符(5种方法)

问题描述:在字符串中寻找特定字符 1、第1次出现位置 实现函数原型: int indexOf(char c) Java代码: import java.io.*; public class Way_1 {public static void main(String args[]){String str "Geeks for Geeks is a computer s…

疲劳驾驶监测报警摄像机

疲劳驾驶是导致交通事故的重要原因之一,为了提高驾驶安全性,科技日新月异,疲劳驾驶监测报警摄像机因其先进的技术而成为关注焦点。 疲劳驾驶监测报警摄像机采用先进的人脸识别技术和人工智能算法,能够实时监测驾驶员的状态。通过对…

文件操作和IO(2):Java中操作文件

目录 一、File的属性 二、File的构造方法 三、File的方法 四、代码示例 1、getName,getParent,getPath方法 2、getAbsolutePath,getCanonicalPath方法 3、exists,isDirectory,createNewFile方法 4、createNewF…

龙蜥 Anolis OS8.4 设置IP

1、配置文件路径 /etc/sysconfig/network-scripts/ [rootlocalhost ~]# cd /etc/sysconfig/network-scripts/ [rootlocalhost network-scripts]# ls ifcfg-ens32 进入配置文件路径后,展示。ifcfg-ens32这个不同的服务器不一样,本次虚拟机所对应的是ens3…

2. vue 工程创建

1. 基于 vite创建 官方文档: https://v3.cn.vuejs.org/guide/installation.html#vite vite官网: https://vitejs.cn 使用vite创建的优势: 开发环境中,无需打包操作,可快速的冷启动。轻量快速的热重载(HMR)。真正的按需编译,不再…

CSS列表属性

CSS列表属性 列表相关的属性&#xff0c;可以作用在 ul、ol、li 元素上。 代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>列表相关属性</title><style>ul {/* …

牛客网C++专项题目整理(1)

1. 若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是 1.p s; 2.p k; 3.p s[0]; 4.k s; 答案&#xff1a;124 char s[3][10] s 是数组指针&#xff0c;类型为char (*)[3]&#xff0c;所指向的每个数组长度为10; char (*k)[3] k是一个数组指针&a…

国内哪个工具可以平替chatgpt?国内有哪些比较好用的大模型gpt?

我自己试用了很多的平台&#xff0c;发现三个比较好的大模型平台&#xff0c;对普通用户也比较的友好的&#xff0c;而且返回内容相对来说&#xff0c;正确率更高的&#xff0c;并且相关场景插件比较丰富的国内厂商。 本文说的&#xff0c;是我自己觉得的&#xff0c;比较有主观…

拆帧神器:深度解读Netty中的DelimiterBasedFrameDecoder()

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 拆帧神器&#xff1a;深度解读Netty中的DelimiterBasedFrameDecoder 前言基础概念分隔符的配置与选择帧的拆分与重组帧的拆分过程&#xff1a;处理分隔符位于帧中间的情况&#xff1a; 处理半包与粘包…

AI时代,我们需要什么能力?

AI 时代&#xff0c;一定会重构很多行业&#xff0c;也会重构人民的生活工作方式&#xff0c;那么 AI 时代&#xff0c;我们需要培养什么能力呢&#xff1f; 我们应该去做那些 AI 做不了的事情&#xff01;让 AI 成为我们的工具&#xff0c;助力我们更高效的解决问题&#xff…

【IO流系列】字符流练习(拷贝、文件加密、修改文件数据)

字符流练习 练习1&#xff1a;文件夹拷贝1.1 需求1.2 代码实现1.3 输出结果 练习2&#xff1a;文件加密与解密2.1 需求2.2 代码实现2.3 输出结果 练习3&#xff1a;修改文件数据&#xff08;常规方法&#xff09;3.1 需求3.2 代码实现3.3 输出结果 练习4&#xff1a;修改文件数…

【MySQL】查询语句:条件、排序和分页

基本查询 MySQL 数据库使用SELECT语句来查询数据。 查询字段 以下为在MySQL数据库中查询数据通用的 SELECT 语法&#xff1a; SELECT 字段名,字段名... FROM 表名;选择全部列 SELECT * FROM emp; -- 查询所有字段一般情况下&#xff0c;除非需要使用表中所有的字段数据&…

消防主机报故障时发出故障及原因及解决办法!

本文以青鸟消防JBF-11SF为例。 其他型号或品牌的消防主机也可参考。 开机前&#xff0c;必须先测量系统接线的绝缘电阻&#xff0c;确保各绝缘电阻满足以下要求&#xff1a; 1&#xff09;空载时各电路信号线之间的绝缘值应大于5K欧姆。 2&#xff09;正常天气条件下&#x…

Java SE:反射

反射作用 获取字节码文件里面的所有信息&#xff0c;包括构造方法、成员、成员方法&#xff0c;以及修饰他们的修饰符、类型和方法的返回值等等&#xff0c;只要是类里面的内容都能获取&#xff0c;获取之后可以动态的调用方法&#xff0c;动态的创建对象 获取类字节码文件对象…

2024全国水科技大会暨新材料在水污染防治中的应用论坛(十)

召集人&#xff1a;唐 量 上海大学环境与化学工程学院教授 庄赞勇 福州大学材料科学与工程学院教授 一、会议背景 为积极应对“十四五”期间我国生态环境治理面临的挑战&#xff0c;加快生态环境科技创新&#xff0c;构建绿色技术创新体系&#xff0c;全面落实科学技术部、生…

点云数据结构化与体素化理论学习

一、PCD点云数据存储格式的进一步认识 &#xff08;一&#xff09;PCD点云存储格式相较于其它存储格式&#xff08;如PLY、STL、OBJ、X3D等&#xff09;的优势[1] &#xff08;1&#xff09;具有存储和处理有组织的点云数据集的能力&#xff0c;这对于实时应用和增强现实及机器…

20240302-1-ZooKeeper面试题(三)

21. 集群最少要几台机器&#xff0c;集群规则是怎样的? 集群规则为 2N1 台&#xff0c;N>0&#xff0c;即 3 台。 22. 集群支持动态添加机器吗&#xff1f; 其实就是水平扩容了&#xff0c;Zookeeper 在这方面不太好。两种方式&#xff1a;第 62 页 共 485 页全部重启&a…

苍穹外卖学习 Day10 Day11 Day12

前言 用于记录苍穹外卖Day10、Day11、Day12的学习 Day10 订单状态定时处理 来电提醒 客户催单 订单状态定时处理 Spring Task Spring Task是一个任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑&#xff08;定时自动执行某段Java代码&#xff09; cron表…

代码随想录算法训练营第三十天| 回溯篇总结

文章目录 前言一、组合问题二、切割问题三、子集问题四、排列问题五、性能分析总结 前言 回溯法就是暴力搜索&#xff0c;并不是什么高效的算法&#xff0c;最多再剪枝一下。 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合 排列问题&#xff1a;N个数按一定规则全…

【黑马程序员】STL之set和map容器

文章目录 set/multiset容器set基本概念简介区别 set的构造和赋值功能描述函数原型代码示例运行结果 set的大小和交换功能描述函数原型代码示例运行结果 set的插入和删除功能描述函数原型代码示例运行结果 set查找和统计函数原型代码示例运行结果 set和multiset区别区别代码示例…