当前位置: 首页 > news >正文

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.自定义信号

自定义信号比较少见,实际开发中很少会需要自定义信号

自定义槽函数,非常关键,开发中大部分情况都是需要自定义槽函数的

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

5.带参数的信号和槽

Qt的信号和槽也支持带有参数,同时也可以支持重载,

此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表一致

一致主要是要求类型,个数可以不一致,但是信号的参数的个数必须要比槽函数的参数个数要多

此时信号触发,调用到槽函数的时候,信号函数中的实参就能够被传递到槽函数的形参当中

QT中如果要让某个类能够使用信号槽,可以在类中定义信号和槽,则必须在类最开始的地方,写下Q_OBJECT宏,能展开成很多额外的代码

6.信号和槽的断开

使用disconnect来断开信号槽的连接

connectdisconnect使用方法很像

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没有开放根节点&#xff0c;所以一般情况下通过app.components注册&#xff0c;在需要的页面直接写组件标签&#xff0c;但是如果每个页面都需要的话&#xff0c;再每个都加的话会非常的麻烦 网上的思路都不咋地&#xff1a; 1.通过写一个透明弹窗页面来实现&#…...

python 语法学习 day 7

错题反思 1.九九乘法表 第一次提交的答案是&#xff1a;先把所有输入值放在列表里面 EOF&#xff0c;输入后产生异常-->>捕获异常&#xff0c;结束输入 3. 题意:统计单词的种类以及数量(忽略大小写)&#xff0c;最终以降序输出&#xff08;出现次数相同的单词根据单词的…...

【高中数学/幂函数】比较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正半轴是增函数&#xff0c;底数大的得数就大。 因为9>8>7,所以b>a>c 【图像】 在图像上绘出曲线yx^1/10&…...

双向带头循环链表

一、概念 何为双向&#xff1a;此链表每一个节点的指针域由两部分组成&#xff0c;一个指针指向下一个节点&#xff0c;另一个指针指向上一个节点&#xff0c;并且两头的节点也是如此&#xff0c;头节点的下一个节点是尾节点&#xff0c;尾节点的上一个节点是头节点&#xff1b…...

探索TASKCTL和 DataStage 的ETL任务调度协同

在复杂多变的企业环境中&#xff0c;高效、准确的数据处理是支撑业务决策与运营的核心。本文将深入探讨任务调度平台TASKCTL与ETL工具DataStage的深度融合&#xff0c;通过详尽的代码示例、结合细节以及实际案例的具体描述&#xff0c;展示这两个工具如何携手打造企业数据处理生…...

Windows右键菜单终极清理指南:用ContextMenuManager告别杂乱,重获高效桌面

Windows右键菜单终极清理指南&#xff1a;用ContextMenuManager告别杂乱&#xff0c;重获高效桌面 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 还在为Windows…...

各种“地”—— 各种“GND”

GND&#xff0c;指的是电线接地端的简写。代表地线或0线。电路图上和电路板上的GND(Ground)代表地线或0线.GND就是公共端的意思&#xff0c;也可以说是地&#xff0c;但这个地并不是真正意义上的地。是出于应用而假设的一个地&#xff0c;对于电源来说&#xff0c;它就是一个电…...

代数拓扑运算流程

文章目录0、背景一、标准计算流程&#xff1a;以单纯同调为例空间剖分&#xff0c;构建单纯复形‌生成各维度链群‌定义边界算子‌定义闭链群与边缘链群‌计算同调群并解读拓扑信息‌推导最终拓扑结论‌二、其他核心概念的典型计算逻辑0、背景 之前为了做一个东西学习TDA&…...

斯年智驾IGV精准定位 赋能集装箱智慧港口升级

在集装箱港口智能化作业中&#xff0c;IGV运输车的定位精度直接决定码头转运效率、对接精准度与作业安全性。集装箱装卸、堆存、转运环节衔接紧密&#xff0c;毫米级的定位偏差&#xff0c;都可能造成箱体对接错位、装卸卡顿、物流链路停滞等问题&#xff0c;严重影响港口整体作…...

抖音内容批量下载神器:douyin-downloader 完全使用指南

抖音内容批量下载神器&#xff1a;douyin-downloader 完全使用指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...

Windows安卓子系统WSA:三个实用技巧让你在Windows上流畅运行手机应用

Windows安卓子系统WSA&#xff1a;三个实用技巧让你在Windows上流畅运行手机应用 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA 你是否曾经梦想过在Windows…...

在Nodejs后端服务中集成Taotoken提供AI能力的配置指南

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Nodejs后端服务中集成Taotoken提供AI能力的配置指南 将大模型能力集成到后端服务是现代应用开发的常见需求。对于使用Node.js的开…...

如何为Public Money Public Code网站添加新的支持组织:完整操作指南

如何为Public Money Public Code网站添加新的支持组织&#xff1a;完整操作指南 【免费下载链接】publiccode.asia-legacy Website of https://publiccode.asia 项目地址: https://gitcode.com/gh_mirrors/pu/publiccode.asia-legacy 想要为publiccode.asia这个开源项目…...

Triton模型服务化实战:从Notebook到高可用推理API

1. 项目概述&#xff1a;这不是一次模型训练&#xff0c;而是一场工程交付“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题里藏着一个被太多人轻描淡写、却让无数团队在临门一脚时彻底卡死的真相&#xff1a;Notebook 是思考的草稿纸&…...

实战指南:如何高效使用Python构建CharacterAI智能对话系统

实战指南&#xff1a;如何高效使用Python构建CharacterAI智能对话系统 【免费下载链接】CharacterAI Unofficial Python API for character.ai 项目地址: https://gitcode.com/gh_mirrors/ch/CharacterAI 想要为你的Python项目添加智能对话功能吗&#xff1f;CharacterA…...