C++客户端Qt开发——信号和槽
三、信号和槽
1.信号和槽概述
在Qt中,用户和控件的每次交互过程称为一个事件。比如"用户点击按钮”是一个事件,"用户关闭窗口”也是一个事件。每个事件都会发出一个信号,例如用户点击按钮会发出"按钮被点击"的信号,用户关闭窗口会发出"窗口被关闭"的信号。
Qt中的所有控件都具有接收信号的能力,一个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。例如,按钮所在的窗口接收到"按钮被点击"的信号后,会做出"关闭自己”的响应动作;再比如输入框自己接收到"输入框被点击"的信号后,会做出"显示闪烁的光标,等待用户输入数据”的响应动作。在Qt中,对信号做出的响应动作就称之为槽。
信号和槽是Qt特有的消息传输机制,它能将相互独立的控件关联起来。比如,"按钮"和"窗口"”本身是两个独立的控件,点击"按钮”并不会对"窗口"造成任何影响。通过信号和槽机制,可以将"按钮"和"窗口"关联起来,实现"点击按钮会使窗口关闭"的效果。
Qt中,谈到信号,也是涉及到三个要素
- 信号源:由哪个控件发出的信号,
- 信号的类型:用户进行不同的操作,就可能触发不同的信号
- 信号的处理方式:槽(slot)=>函数,Qt中可以使用connect这样的函数,把一个信号和一个槽关联起来,后续只要信号触发了,Qt就会自动的执行槽函数
槽本质是回调函数
2.connect函数
connect函数是QObject提供的静态的成员函数
connect函数原型(旧版本)
connect(const QObject *sender, //描述了哪个控件发出了信号const char * signal, //信号的类型const QObject * receiver, //信号处理:哪个对象处理const char * method, //信号处理:怎么进行处理Qt:ConnectionType type = Qt:AutoConnection) //暂时不考虑,很少使用,有默认值
示例:
ui->setupUi(this);QPushButton* button = new QPushButton(this);button->setText("关闭");button->move(200,200);connect(button,&QPushButton::clicked,this,&Widget::close);
3.自定义槽
自定义一个槽函数,操作过程和自定义一个普通的成员函数没什么区别
以前的槽函数必须放到public/private/protected slots:
protected slots,此处是qt自己扩展的关键字,不是C++标准中的语法
Qt里广泛使用了元编程技术,基于代码生成代码,qmake构建qt项目的时候,就会调用专门的扫描器,扫描代码中特定的关键字,给予关键字自动生成一大堆相关代码
①第一种创建方法
创建按钮,处理机制为自定义函数

声明后,实现自定义函数

②第二种创建方法
先用ui文件拖一个控件

通过ui->pushButton获取到界面上拖进去的这个按钮,然后实现该自定义函数

也可以直接在按钮上右击选择转到槽(更推荐)


直接生成好一个函数(也完成了声明,且没有connect,因为在qt中,除了通过connect来连接信号槽之外,还可以通过函数名字的方式来自动连接)
on_pushButton_clicked这部分是按钮的objectName,当函数名渡河上述规则后,qt就能自动把信号和槽建立起联系


4.自定义信号
自定义信号比较少见,实际开发中很少会需要自定义信号
自定义槽函数,非常关键,开发中大部分情况都是需要自定义槽函数的
- 信号是一类非常特殊的函数,程序员只要写出函数声明并告诉qt这是一个“信号”即可,在声明的时候,需要在
signal关键字中,这个函数的定义,是在qt编译过程中自动生成的,程序员无法干预,信号在qt中是特殊机制,qt生成的信号函数的实现,要配合qt框架做很多既定的操作 - 作为信号函数,返回值必须是void,有没有参数都可以,甚至可以支持重载,
signals是qt自己扩展出来的关键字,在自定义信号声明前加上,qmake的时候,会调用一些代码的分析/生成工具,扫描到signal关键字的时候,此时,就会自动把下面的函数声明认为是信号,并且给这些信号函数自动生成函数定义


5.带参数的信号和槽
Qt的信号和槽也支持带有参数,同时也可以支持重载,
此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表一致
一致主要是要求类型,个数可以不一致,但是信号的参数的个数必须要比槽函数的参数个数要多
此时信号触发,调用到槽函数的时候,信号函数中的实参就能够被传递到槽函数的形参当中

QT中如果要让某个类能够使用信号槽,可以在类中定义信号和槽,则必须在类最开始的地方,写下Q_OBJECT宏,能展开成很多额外的代码
6.信号和槽的断开
使用disconnect来断开信号槽的连接
connect和disconnect使用方法很像
void Widget::on_pushButton_clicked()
{disconnect(ui->pushButton,&QPushButton::clicked,this,&Widget::on_pushButton_2_clicked);connect(ui->pushButton,&QPushButton::clicked,this,&Widget::on_pushButton_clicked);this->setWindowTitle("1");
}void Widget::on_pushButton_2_clicked()
{// 先断开原来的pushButton原来的信号槽disconnect(ui->pushButton,&QPushButton::clicked,this,&Widget::on_pushButton_clicked);// 重新绑定信号槽connect(ui->pushButton,&QPushButton::clicked,this,&Widget::on_pushButton_2_clicked);this->setWindowTitle("2");
}



7.lambda表达式定义槽函数
本质是一个匿名函数,主要应用在“回调函数”场景中,一次性使用


为解决上述问题,引入了“变量捕获”语法

需要多个变量就用逗号隔开,放在方括号中即可
如果想要把上层作用域所有变量名都捕获进来,传入=即可

还可以按照引用的方式来捕获[&],但是qt中很少这么写,捕获到的变量一般都是各种控件的指针,指针变量按照值传递或者引用来传递都无所谓,如果按引用,还得更关注这个引用的变量本身的生命周期
如果对应的槽函数比较简单且一次性使用,就会经常写这种lambda的形式
另外也需要确认捕获到
lambda内部的变量是有意义的:回调函数执行时机是不确定的(用户何时点击按钮是不知道的)如果是像widget对象,他在main函数中,跟随进程结束销毁,但是在访问其他的变量的时候,要确保他在被使用的时候还未被销毁,明确对象生命周期管理
lambda语法是C++11中引入的,如果对于QT5及其更高版本,默认就是按照C++11来编译的,如果使用QT4或者更老的版本,就需要手动在.pro文件中加上C++11的编译选项CONFIG += c++11
相关文章:
C++客户端Qt开发——信号和槽
三、信号和槽 1.信号和槽概述 在Qt中,用户和控件的每次交互过程称为一个事件。比如"用户点击按钮”是一个事件,"用户关闭窗口”也是一个事件。每个事件都会发出一个信号,例如用户点击按钮会发出"按钮被点击"的信号&…...
基于双向长短期记忆 BiLSTM 实现股票单变量时间序列预测(PyTorch版)
前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…...
微信小程序毕业设计-汽车维修项目管理系统项目开发实战(附源码+论文)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…...
学习大数据DAY16 PLSQL基础语法5
目录 异常 自定义异常的格式 raise_application_error 处理异常 预定义异常 SQLcode和SQLerrm 非预定义异常 作业 触发器 触发器基本概念 DML触发器 DML触发器使用 instead of 触发器 管理触发器 作业2 函数、过程和包 函数 过程 参数 1. in 参数 2.out 参…...
LabVIEW心电信号自动测试系统
开发了一种基于LabVIEW的心电信号自动测试系统,通过LabVIEW开发的上位机软件,实现对心电信号的实时采集、分析和自动化测试。系统包括心电信号采集模块、信号处理模块和自动化测试模块,能够高效、准确地完成心电信号的测量与分析。 硬件系统…...
最值得推荐的10款Windows软件!
AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频播放量破百万https://aitools.jurilu.com/1.音乐播放器——Dopamine Dopamine是一款音乐播放器,设计简洁美观。它支持多种音频格式,包括wav、mp3、ogg…...
游戏视频是后期配音好还是边录边配 游戏视频怎么剪辑制作才能火 视频剪辑免费软件
游戏视频后期配音是先配还是先剪?游戏视频后期配音没有统一的准则,可以先配,也可以后配,主要是根据内容而定。游戏视频剪辑在游戏玩家中十分流行,那么,游戏视频怎么剪辑制作?下面让我们以具体的…...
配置 Node.js 内存限制
配置 Node.js 内存限制 Node.js 应用程序通常需要配置堆内存的大小以优化性能和避免内存溢出问题。你可以通过命令行参数、环境变量或系统属性来设置 Node.js 的内存限制。下面将分别介绍在 Windows、Linux 和 macOS 系统下的配置方法。 Windows 系统 1. 命令行参数方式 在…...
ORA-12518: TNS: 监听程序无法分发客户机连接
ORA-12518: TNS: 监听程序无法分发客户机连接 OracleService 服务停止了,启动就好了...
2.5 计算机网络
声明:文章参考的《系统架构设计师教程(第二版)》,如有侵权,本人将立即修改和删除。 利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,并依靠网络软件以及通信协议实现…...
同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器
同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器 同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清…...
「ETL趋势」分区支持PostgreSQL、Greenplum、Gauss200, 定时任务支持Kettle
FineDataLink作为一款市场上的顶尖ETL工具,集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具,进行了新的维护迭代。本文把FDL4.1.9最新功能作了介绍,方便大家对比:(产品更新详情:…...
vue 前端项目调用后端接口记录
axios中不同的类型的请求附带数据使用的关键字 请求类型关键字示例GETparamsaxios({ method: get, url: example.com, params: { key: value } })POSTdataaxios({ method: post, url: example.com, data: { key: value } })PUTdataaxios({ method: put, url: example.com, dat…...
4.10、matlab生成脉冲序列:pulstran()函数
1、matlab生成脉冲序列简介 MATLAB生成脉冲序列通常涉及到使用MATLAB中的函数或编程来创建具有特定时间间隔和幅度的脉冲信号。脉冲序列通常用于数字信号处理、通信系统测试等应用中。 生成脉冲序列可以采用以下方法之一: 使用MATLAB中的函数,例如square()函数生成方波信号…...
【JAVA poi-tl-ext 富文本转word】
富文本转word 环境使用poi-tl-ext的原因富文本转word代码 环境 jdk 1.8 <dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.4.16</version> </dependency>poi-tl-ext已经包…...
uniapp 小程序注册全局弹窗组件(无需引入,无需写标签)
由于uniapp没有开放根节点,所以一般情况下通过app.components注册,在需要的页面直接写组件标签,但是如果每个页面都需要的话,再每个都加的话会非常的麻烦 网上的思路都不咋地: 1.通过写一个透明弹窗页面来实现&#…...
python 语法学习 day 7
错题反思 1.九九乘法表 第一次提交的答案是:先把所有输入值放在列表里面 EOF,输入后产生异常-->>捕获异常,结束输入 3. 题意:统计单词的种类以及数量(忽略大小写),最终以降序输出(出现次数相同的单词根据单词的…...
【高中数学/幂函数】比较a=2^0.3,b=3^0.2,c=7^0.1的大小
【问题】 比较a2^0.3,b3^0.2,c7^0.1的大小 【解答】 a2^0.32^3/10(2^3)^1/108^1/10 b3^0.23^2/10(3^2)^1/109^1/10 c7^0.17^1/10 由于yx^1/10在x正半轴是增函数,底数大的得数就大。 因为9>8>7,所以b>a>c 【图像】 在图像上绘出曲线yx^1/10&…...
双向带头循环链表
一、概念 何为双向:此链表每一个节点的指针域由两部分组成,一个指针指向下一个节点,另一个指针指向上一个节点,并且两头的节点也是如此,头节点的下一个节点是尾节点,尾节点的上一个节点是头节点;…...
探索TASKCTL和 DataStage 的ETL任务调度协同
在复杂多变的企业环境中,高效、准确的数据处理是支撑业务决策与运营的核心。本文将深入探讨任务调度平台TASKCTL与ETL工具DataStage的深度融合,通过详尽的代码示例、结合细节以及实际案例的具体描述,展示这两个工具如何携手打造企业数据处理生…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
