初识Qt · 信号与槽 · 基础知识

news2025/3/7 1:41:38

目录

前言:

信号和槽初识

两个问题


前言:

本文我们正式开始介绍信号与槽这个概念,在谈及Qt中的信号与槽这个概念之前,我们不妨回顾一下Linux中的信号,比如发生了除0错误,OS就会给该进程发送一个信号,使该进程终止。

那么Linux中涉及信号的时候,涉及到了谁发出的,什么信号,执行的行为,谁接受的。在我们前文熟悉Qt的整个框架的时候,使用的函数connect,参数分别就是上面涉及到了四个点,所以实际上Qt中的信号和Linux中的信号是有很多相同点的,那么有了Linux的基础,在这里学习Qt我们就要轻松很多了。


信号和槽初识

说到底,我们现在还是没有理解什么是槽,什么是信号,这里先给一个结论:

信号和槽都是函数

但是,为什么信号是函数这里并不打算展开来说,我们在这里能理解的是槽是函数,那么也就是说,某个控件接收到了某个信号,就要执行对应的槽函数,那么我们为什么控件知道接收到了某个信号就应该执行某个槽函数呢?

这是因为connect将槽函数和信号关联在了一起。

那么槽和信号的触发顺序是什么呢?我们不妨举个女朋友在一个月中总有那么不舒服的几天,当我们接收到了女朋友不舒服的这个信号,我们就应该知道我们该倒红糖水,该揉揉肚子什么的。

所以对于信号和槽的一个处理顺序来看,我们就应该知道,在信号处理之前,我们一定要有槽函数的这个定义,如果没有定义,我们就错过了这个信号的处理,自然而言的,女朋友的”蜀道难“也就来了。

那么我们回到Qt就知道,connect函数实际上是一个回调函数,信号是函数吧?槽是函数吧?那么这两个函数作为了connect函数的参数,也就成就了一个典型回调函数。

那么既然介绍到了connect,对于参数部分我们就不用提及了,对于C++中的库函数我们都是知道来源于谁的,那么connect函数是来源于谁呢?

牵扯到了这个问题,我们就不得不谈一谈Qt中的一个继承关系,拿隔壁java举例,我们知道java的所有类都继承于一个专门的类,叫做Object,在Qt中也有一个类似的设定,即QObject是所有内置类的祖宗:

那么connect函数呢就是QObject中的一个静态成员函数。

 //connect to a functor, with a "context" object defining in which event loop is going to be executed
    template <typename Func1, typename Func2>
    static inline typename std::enable_if<QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1, QMetaObject::Connection>::type
            connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot,
                    Qt::ConnectionType type = Qt::AutoConnection)

这是它的一个函数定义。

对于我们之前看到的connect函数好像又有所不同,我们之前使用的connect函数好像没有那么复杂,我们之前使用Qt函数的原型是:

可是你看上面的类型,好像无论如何都没有办法和char*打上交道,对于第一个和第三个来说多正常,因为这两个参数是接收控件的嘛,子类赋值给基类,非常正常,可是其他参数呢?

之前使用第二个和第四个的参数可是函数指针类型,和char*是一点没有关系的,这怎么能够防在一起?实际上两个宏有关,一个是给槽函数传参的时候要搭配一个SLOT宏,一个是给信号函数传参的时候需要搭配一个SIGNAL宏。这两个宏可以让传入的指针变成char*。所以以前写的时候,是这样使用connect函数的:

connect(button,SIGNAL(&QPushButton::clicked),this,SLOT(&Widget::close));

但是这个写法是Qt4之前的了,对于新版的Qt就不用这样写了,实在是麻烦,新版的Qt5支持了一个重载版本,使得第二个和第四个参数变成了泛型指针,我们也就不用宏了,当然你要想那样写应该也没事儿~

这个时候的Qt就有了一个类型检查的功能,在上文提供的一个源码来说:

const typename QtPrivate::FunctionPointer<Func1>::Object *sender

这是一个类型萃取器,如果传入的参数第一个和第二个不匹配,第三个和第四个不匹配,主要指的是函数指针,编译就会报错了~当然,这里我们了解一下就行。

现在我们来了解一下信号,我们会发现之前使用button的信号的时候,有两个click,一个是过去分词形式,一个是动词形式:

其中这个锯齿形状的就是slot函数,也就是槽函数,比如我触发了一个信号,然后某个按钮就click了,对于波纹状的就是信号函数,是我们点击了,然后触发了信号。

这是二者的区别。

对于connect函数来说,第一个和第二个的参数类型应该是匹配的,第一个比如是button,第二个就应该是父类的信号,不能是其他的,比如QLineEdit的。

以上是对connect函数的一个简单理解。

实际上在以前老版本的时候,实现槽函数应该在前面加:
 

public slot:
    void Handle();

但是现在不用了~你要想也可以~ 


如何查阅

我咋知道QPushButton中有个clicked信号?我咋知道QWidget有个close槽?

也就是我们可以延展到我们怎么翻阅文档?

直接就是打开一手assistant,从中我们直接在索引部分找QPushButtion,但是我们似乎翻遍了文档也没有找到clicked信号。

这其实是因为clicked是继承于它的父类的,那么我们从哪里进到父类呢?

Inherits是继承,也就是说该类是继承于QAbstractButton的,下面的同理,我们点进去看看:

就可以看到它同样是继承了别的类的。

往下滑动就可以看到对应的槽函数和信号函数了,那么信号函数的缺省值我们不用管,稍微想想也能相通。

以上是对信号和槽的一个简单知识输出。


感谢阅读!

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

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

相关文章

Java高频面试之集合-03

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;说说ArrayList和LinkedList的区别 ArrayList 与 LinkedList 的详细对比 一、底层数据结构 特性ArrayListLinkedList存…

宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪

2025年3月5日&#xff0c;机器人行业龙头宇树科技&#xff08;Unitree&#xff09;在深圳再添新动作——全资子公司深圳天羿科技有限公司正式成立。这家注册资本10万元、法定代表人周昌慧的新公司&#xff0c;聚焦智能机器人研发与销售&#xff0c;标志着宇树科技在华南市场的战…

【长安大学】苹果手机/平板自动连接认证CHD-WIFI脚本(快捷指令)

背景&#xff1a; 已经用这个脚本的记得设置Wifi时候&#xff0c;关闭“自动登录” 前几天实在忍受不了CHD-WIFI动不动就断开&#xff0c;一天要重新连接&#xff0c;点登陆好几次。试了下在网上搜有没有CHD-WIFI的自动连接WIFI自动认证脚本&#xff0c;那样我就可以解放双手&…

计算机毕业设计SpringBoot+Vue.js电商平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【杂谈】信创电脑华为w515(统信系统)登录锁定及忘记密码处理

华为w515麒麟芯片版&#xff0c;还有非麒麟芯片版本&#xff0c;是一款信创电脑&#xff0c;一般安装的UOS系统。 准备一个空U盘&#xff0c;先下载镜像文件及启动盘制作工具&#xff0c;连接如下&#xff1a; 百度网盘 请输入提取码 http://livecd.uostools.com/img/apps/l…

初始提示词(Prompting)

理解LLM架构 在自然语言处理领域&#xff0c;LLM&#xff08;Large Memory Language Model&#xff0c;大型记忆语言模型&#xff09;架构代表了最前沿的技术。它结合了存储和检索外部知识的能力以及大规模语言模型的强大实力。 LLM架构由外部记忆模块、注意力机制和语…

Vue+el-upload配置minIO实现大文件的切片并发上传、上传进度展示、失败重试功能

vue3el-upload实现切片上传 效果图 初始界面 上传中的界面 上传完成的界面 上传失败的界面 <template><div><el-uploadclass"BigFileUpload"ref"uploadRef"action"#"drag:show-file-list"false":on-change"…

正则表达式梳理(基于python)

正则表达式&#xff08;regular expression&#xff09;是一种针对字符串匹配查找所定义的规则模式&#xff0c;独立于语言&#xff0c;但不同语言在实现上也会存在一些细微差别&#xff0c;下面基于python对常用的相关内容进行梳理。 文章目录 一、通用常识1.通配符ps.反义 2.…

【仿muduo库one thread one loop式并发服务器实现】

文章目录 一、项目介绍1-1、项目总体简介1-2、项目开发环境1-3、项目核心技术1-4、项目开发流程1-5、项目如何使用 二、框架设计2-1、功能模块划分2-1-1、SERVER模块2-1-2、协议模块 2-2、项目蓝图2-2-1、整体图2-2-2、模块关系图2-2-2-1、Connection 模块关系图2-2-2-2、Accep…

服务流程设计和服务或端口重定向及其websocket等应用示例

服务流程设计和服务或端口重定向及其websocket等应用示例 目录 服务或端口重定向的服务设计和websocket等应用示例 一、通用请求控制流程 1.1、入口 1.2、所有GET请求首先预检控制单元 1.3、http请求会分别自动307重定向 1.4、所有请求首先执行跨源控制单元 1.5、然后…

【数据库】关系代数

关系代数 一、关系代数的概念二、关系代数的运算2.1 并、差、交2.2 投影、选择2.3 笛卡尔积2.4 连接2.5 重命名2.6 优先级 一、关系代数的概念 关系代数是一种抽象的数据查询语言用对关系的运算来表达查询 运算对象&#xff1a;关系运算符&#xff1a;4类运算结果&#xff1a;…

ubuntu20 安装python2

1. 确保启用了 Universe 仓库 在某些情况下&#xff0c;python2-minimal 包可能位于 Universe 仓库中。你可以通过以下命令启用 Universe 仓库并更新软件包列表&#xff1a; bash复制 sudo add-apt-repository universe sudo apt update 然后尝试安装&#xff1a; bash复制…

MySQL无法连接到本地localhost的解决办法2024.11.8

问题描述&#xff1a;我的MySQL可以远程连接服务器&#xff0c;但无法连接自己的localhost。 错误提示&#xff1a; 2003 - Cant connet to MySQL server on localhost(10061 "Unknown error")查找问题原因&#xff1a; 1. 检查环境变量是否正确&#xff1a;发现没…

最新Spring Security实战教程(一)初识Spring Security安全框架

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

告别GitHub连不上!一分钟快速访问方案

一、当GitHub抽风时&#xff0c;你是否也这样崩溃过&#xff1f; &#x1f621; npm install卡在node-sass半小时不动&#x1f62d; git clone到90%突然fatal: early EOF&#x1f92c; 改了半天hosts文件&#xff0c;第二天又失效了... 根本原因&#xff1a;传统代理需要复杂…

Leetcode 1477. 找两个和为目标值且不重叠的子数组 前缀和+DP

原题链接&#xff1a; Leetcode 1477. 找两个和为目标值且不重叠的子数组 class Solution { public:int minSumOfLengths(vector<int>& arr, int target) {int narr.size();int sum0;int maxnINT_MAX;vector<int> dp(n,maxn);//dp[i]表示以索引i之前的满足要求…

R语言绘图:韦恩图

韦恩分析 韦恩分析&#xff08;Venn Analysis&#xff09;常用于可视化不同数据集之间的交集和并集。维恩图&#xff08;Venn diagram&#xff09;&#xff0c;也叫文氏图、温氏图、韦恩图、范氏图&#xff0c;用于显示元素集合重叠区域的关系型图表&#xff0c;通过图形与图形…

智谱AI-FunctionCall

智谱AI-FunctionCall 编写FuncationCall大模型的函数调用&#xff0c;先直观的感受一下的感受下FunctionCall的魅力 文章目录 智谱AI-FunctionCall[toc]1-参考网址2-思路整理3-代码拆件1-[非核心]两个业务函数2-[非核心]业务函数的JsonSchema定义3-[核心]FunctionCall的调用1-打…

android亮灭屏流程分析

前言 亮灭涉及的东西非常多&#xff0c;因此单独写一个文档&#xff0c;进行详细说明&#xff0c;亮灭屏包括的东西不只是亮灭屏&#xff0c;还包括亮度调节、屏幕状态变化等东西。本文仅作学习使用&#xff0c;不涉及商业&#xff0c;侵权请联系删除。 framework层的学习链接…

Docker Desktop常见问题记录

1.docker pull报错&#xff0c;无法连接https://registry-1.docker.io/v2/ 报错信息如下&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection(Client.Timeout exceeded …