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

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++;});
  • 第二对括号,传递参数;第三对括号,实现逻辑。

相关文章:

Qt:4.信号和槽

目录 1.信号源、信号和槽&#xff1a; 2.Qt类的继承关系&#xff1a; 3.自定义槽函数&#xff1a; 4.第一种信号和槽的连接的方法&#xff1a; 5.第二种信号和槽的连接的方法&#xff1a; 6.自定义信号&#xff1a; 7.发射信号&#xff1a; 8.信号和槽的传参&#xff1a;…...

Ubuntu20.04更新GLIBC到2.35版本

目录 1 背景2 增加源2.1 标准源2.2 镜像源 3 更新 1 背景 Ubuntu20.04默认GLIBC库版本是2.31.今天碰到一个软件需要2.35版本的GLIBC。 升级GLIBC库有两种方式&#xff1a; 下载高版本库源码&#xff0c;编译后替换系统中低版本库。由于GLIBC库是Linux系统中最基础库&#xff…...

Qt 实战(7)元对象系统 | 7.1、简介

文章目录 一、简介1、元对象系统的基本条件2、元对象系统的核心功能3、元对象系统的核心类4、总结 Qt的元对象系统&#xff08;Meta-Object System&#xff09;是Qt框架中一个极其重要的组成部分&#xff0c;它为Qt提供了信号与槽机制、实时类型信息&#xff08;RTTI&#xff0…...

iOS 真机打包,证书报错No signing certificate “iOS Distribution” found

之前将APP从旧账号转移到了新账号&#xff0c;在新账号打包的时候遇到的证书问题。 因为新账号还没有导出“本地签名证书”&#xff0c;也还没有创建新的“发布证书”。当我创建好这两者之后&#xff0c;在xcode打包的时候就报错了。 报错信息&#xff1a; No signing certifi…...

2024年7月3日 (周三) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 《魅魔》新DLC《Elysian Fields…...

linux守护进程生命周期管理-supervisord

简介 supervisor是一个client/server系统,允许用户控制多个类unix系统的进程,摆脱rc.d脚本的不方便性.supervisor具有简单,集中化管理,搞笑,可扩展性,高兼容. 整套软件包含:supervisord(守护进程),supervisorctl(命令行工具),web server(一个web交互界面),XML-RPC 交互 安装 …...

rtpengine_mr12.0 基础建设容器运行

目录 Dockerfile rtpengine.conf 容器内编译安装 RTPEngine 正常提供功能 1. 启动RTPEngine服务 2. 删除 RTPEngine服务 3. 加载内核模块 检查所有进程是否正在运行 上传到仓库 博主wx&#xff1a;yuanlai45_csdn 博主qq&#xff1a;2777137742 后期会创建粉丝群&…...

逐步深入:掌握sklearn中的增量学习

&#x1f680; 逐步深入&#xff1a;掌握sklearn中的增量学习 在机器学习领域&#xff0c;增量学习&#xff08;也称为在线学习&#xff09;是一种重要的学习方式&#xff0c;它允许模型在新数据到来时进行更新&#xff0c;而不需要重新训练整个数据集。这对于处理大量数据或实…...

【机器学习】机器学习与图像识别的融合应用与性能优化新探索

文章目录 引言第一章&#xff1a;机器学习在图像识别中的应用1.1 数据预处理1.1.1 数据清洗1.1.2 数据归一化1.1.3 数据增强 1.2 模型选择1.2.1 卷积神经网络1.2.2 迁移学习1.2.3 混合模型 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 Adam优化器 1.4 模型评估与性能优…...

Unity射击游戏开发教程:(29)躲避敌人的子弹射击

在这篇文章中,我将介绍如何创建一个可以使玩家火力无效的敌人。创建的行为如下...... 当玩家向敌人开火时,敌人会向左或向右移动。向左或向右的移动是随机选择的,并在一段时间后停止敌人的移动。如果敌人移出屏幕,它就会绕到另一边。将一个精灵拖到画布上,将其缩小以匹配游…...

SpringCloud Gateway 网关获取或修改接口响应数据

文章目录 前言一、获取响应数据并打印 前言 我们的网关在之前只记录了接口请求日志&#xff0c;响应日志是没有做记录的&#xff0c;在后续别人对接我们开放平台时出现了一些问题没法确认当时的一个数值状态&#xff0c;照成了很多不必要的麻烦&#xff0c;后来决定在网关添加上…...

【课程总结】Day13(上):使用YOLO进行目标检测

前言 在上一章《【课程总结】Day11&#xff08;下&#xff09;&#xff1a;YOLO的入门使用》的学习中&#xff0c;我们通过YOLO实现了对图片的分类任务。本章的学习内容&#xff0c;将以目标检测为切入口&#xff0c;了解目标检测流程&#xff0c;包括&#xff1a;数据标准、模…...

老年生活照护实训室:探索现代养老服务的奥秘

在老龄化社会加速发展的今天&#xff0c;如何为老年人提供优质、贴心的生活照护服务&#xff0c;成为了社会关注的焦点。老年生活照护实训室作为培养专业养老服务人才的重要场所&#xff0c;正逐渐揭开现代养老服务的神秘面纱&#xff0c;为我们展现出一幅充满关爱与智慧的画卷…...

python-字典

为什么需要字典 字典的定义 字典数据的获取 字典的嵌套 嵌套字典的内容获取 字典的注意事项&#xff1a; 字典的常用操作 新增元素 更新元素 删除元素 清空字典 汇总 字典的特点...

使用java stream对集合中的对象按指定字段进行分组并统计

一、概述 有这样一个需求&#xff0c;在一个list集合中的对象有相同的name&#xff0c;我需要把相同name的对象进行汇总计算。使用java stream来实现这个需求&#xff0c;这里做一个记录&#xff0c;希望对有需求的同学提供帮助 一、根据指定字段进行分组 一、先准备好给前端要…...

03.C1W2.Sentiment Analysis with Naïve Bayes

目录 Probability and Bayes’ RuleIntroductionProbabilitiesProbability of the intersection Bayes’ RuleConditional ProbabilitiesBayes’ RuleQuiz: Bayes’ Rule Applied Nave Bayes IntroductionNave Bayes for Sentiment Analysis P ( w i ∣ c l a s s ) P(w_i|clas…...

一个强大的分布式锁框架——Lock4j

一、简介 Lock4j是一个分布式锁组件&#xff0c;它提供了多种不同的支持以满足不同性能和环境的需求&#xff0c;基于Spring AOP的声明式和编程式分布式锁&#xff0c;支持RedisTemplate、Redisson、Zookeeper。 二、特性 • 简单易用&#xff0c;功能强大&#xff0c;扩展性…...

HarmonyOS - 通过.p7b文件获取fingerprint

1、查询工程所对应的 .p7b 文件 通常新工程运行按照需要通过 DevEco Studio 的 Project Structure 勾选 Automatically generate signature 自动生成签名文件&#xff0c;自动生成的 .p7b 文件通常默认在系统用户目录下. 如&#xff1a;C:/Users/zhangsan/.ohos/config/default…...

vue3实现echarts——小demo

版本&#xff1a; 效果&#xff1a; 代码&#xff1a; <template><div class"middle-box"><div class"box-title">检验排名TOP10</div><div class"box-echart" id"chart1" :loading"loading1"&…...

Python 项目依赖离线管理 pip + requirements.txt

背景 项目研发环境不支持联网&#xff0c;无法通过常规 pip install 来安装依赖&#xff0c;此时需要在联网设备下载依赖&#xff0c;然后拷贝到离线设备进行本地安装。 两台设备的操作系统、Python 版本尽可能一致。 离线安装依赖 # 在联网设备上安装项目所需的依赖 # -d …...

HashCheck:Windows系统下终极文件完整性验证解决方案

HashCheck&#xff1a;Windows系统下终极文件完整性验证解决方案 【免费下载链接】HashCheck HashCheck Shell Extension for Windows with added SHA2, SHA3, and multithreading; originally from code.kliu.org 项目地址: https://gitcode.com/gh_mirrors/ha/HashCheck …...

Spark--一文了解SparkSql的Join策略

文章目录前言一、join 基本要素二、join 实现三、五种join 策略3.1 2 种数据分发模式&#xff08;数据怎么到同一个节点&#xff09;3.1.1 Broadcast Join&#xff08;广播 Join&#xff0c;也叫 Map Join&#xff09;3.1.2 Shuffle Join&#xff08;重分区 Join&#xff0c;也…...

Imaginary跨域资源共享(CORS)终极配置指南:前端图像处理无障碍集成

Imaginary跨域资源共享(CORS)终极配置指南&#xff1a;前端图像处理无障碍集成 【免费下载链接】imaginary Fast, simple, scalable, Docker-ready HTTP microservice for high-level image processing 项目地址: https://gitcode.com/gh_mirrors/im/imaginary Imaginar…...

Twisted Protocols终极指南:快速构建高性能网络协议的简单方法

Twisted Protocols终极指南&#xff1a;快速构建高性能网络协议的简单方法 【免费下载链接】twisted Event-driven networking engine written in Python. 项目地址: https://gitcode.com/gh_mirrors/tw/twisted Twisted是一个用Python编写的事件驱动网络引擎&#xff0…...

突破性3D建模技术:Wonder3D如何通过单张图像实现高质量三维重建

突破性3D建模技术&#xff1a;Wonder3D如何通过单张图像实现高质量三维重建 【免费下载链接】Wonder3D Single Image to 3D using Cross-Domain Diffusion 项目地址: https://gitcode.com/gh_mirrors/wo/Wonder3D 在数字内容创作领域&#xff0c;从二维图像到三维模型的…...

高效安全备份QQ空间历史说说:GetQzonehistory全方位使用指南

高效安全备份QQ空间历史说说&#xff1a;GetQzonehistory全方位使用指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 功能价值&#xff1a;为什么选择GetQzonehistory&#xff1f; …...

手把手教你用Python实现双足机器人ZMP预观控制(附开源代码)

用Python实现双足机器人ZMP预观控制的完整指南 1. ZMP理论基础与机器人动力学模型 零力矩点(ZMP)理论是现代双足机器人步态规划的核心概念&#xff0c;它定义了地面反作用力合力作用点的位置。当ZMP位于支撑多边形(由机器人足底接触点构成的凸多边形)内时&#xff0c;机器人能保…...

自动驾驶轨迹预测新思路:VectorNet如何用矢量编码替代传统栅格化方法?

自动驾驶轨迹预测的矢量革命&#xff1a;VectorNet如何重构环境编码范式 在自动驾驶系统的决策闭环中&#xff0c;轨迹预测模块犹如驾驶员的预判能力&#xff0c;其准确性直接关系到行车安全与舒适性。传统基于卷积神经网络&#xff08;CNN&#xff09;的预测方法存在一个根本性…...

滴滴盖亚计划ETA数据集实战:如何用Python处理智能交通数据(附完整代码)

滴滴盖亚ETA数据集实战&#xff1a;Python智能交通数据处理全流程解析 引言&#xff1a;智能交通时代的ETA技术价值 在早高峰的深圳深南大道上&#xff0c;网约车司机王师傅刚接单就面临抉择&#xff1a;系统推荐的三条路线中&#xff0c;哪一条能最快到达乘客上车点&#xf…...

5种场景轻松搞定抖音视频保存 开源工具让无水印下载变简单

5种场景轻松搞定抖音视频保存 开源工具让无水印下载变简单 【免费下载链接】douyin_downloader 抖音短视频无水印下载 win编译版本下载&#xff1a;https://www.lanzous.com/i9za5od 项目地址: https://gitcode.com/gh_mirrors/dou/douyin_downloader 在数字内容爆炸的时…...