当前位置: 首页 > 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 …...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...