Qt信号与槽

2023-11-18

信号与槽是Qt编程的基础,信号与槽在Qt中处理界面各个组件的交互操作时变得更加的直观和简单。
信号
信号(Signal)就是在特定情况下被发射的事件。GUI程序设计的主要内容就是对界面上各个组件的信号进行响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。

槽(Slot)就是响应信号的函数。槽就是一个函数,与一般的C++函数一样,可以定义在类的任何部分(public\private\protected),槽函数可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的地方在于,槽函数可以与一个信号关联,当信号被发射的时候,与之相关联的槽函数被动的执行。
信号与槽关联是用QObject::connect()函数来实现,基本的格式为:

Qobject::connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));

sender:发射信号的对象的名称;
signal():信号名称,信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。
SIGNAL和SLOT是Qt的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串。
例:

QObject::connect(btnClose,SIGNAL(clicked()),Widget,SLOT(Close()));
//将btnClose按钮的clicked()信号与窗体Widget的槽函数close()相关联,当单击btnClose按钮时,就会执行Widget的Close()槽函数。

Qt信号与槽的使用规则:

  • 一个信号可以连接多个槽,当一个信号与多个槽相关联时,槽函数按照建立的连接顺序依次执行;当信号和槽函数带有参数时,在connect()函数里要写明参数的类型,但可以不写参数的名称。
  • 多个信号可以连接同一个槽;
  • 一个信号可以连接另外一个信号,例:
connect(sender,SIGNAL(signal()),sender,SIGNAL(signal()));
//当一个信号被发射时,也会发射另外一个信号,实现某些特殊的功能;
  • 严格情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数,如果不匹配,会出现编译错误或者运行错误。
  • 在使用信号与槽的类中,必须在类的定义中加入宏Q_OBJECT;
  • 当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样,只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。
    Qt使用信号与槽的机制实现对象间通信,隐藏了复杂的底层实现,完成信号与槽的关联后,发射信号时不需要知道Qt是如何找到槽函数的,信号与槽的执行速度比回调函数稍微慢点,但灵活性要比回调函数强很多。
    自定义信号及其使用:
    在自己设计的类里可以自定义信号,信号就是在类定义里声明一个函数,但是这个函数无需实现,只需发射(emit).
    例如:
class QPerson:public QObject
{
Q_OBJECT
private:
	int m_age=10;
public:
	void incAge();
signals:
	void ageChanged(int value);
}

信号函数必须是无返回值的函数,但是可以输入参数。信号函数无需实现,只需在某些条件下发射信号。例如在incAge()函数中发射信号:

void QPerson::incAge()
{
	m_age++;
	emit ageChanged(m_age);发射信号
}

当私有变量m_age变化后,发射信号ageChanged(int),表示年龄发生了变换。至于是否有与此信号相关联的槽函数,信号发射者不管。如果在使用QPerson类对象的程序中为此信号关联了槽函数,在incAge()函数里发射此信号时,就会执行相关联的槽函数。至于是否立即执行槽函数,发射信号的线程是否等待槽函数执行完之后再执行后面的代码,与connect()函数设置信号与槽关联时设置的连接类型以及信号与槽是否在同一个线程有关。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt信号与槽 的相关文章

随机推荐

  • hive 报system:java.io.tmpdir错误解决

    Exception in thread main java lang IllegalArgumentException java net URISyntaxException Relative path in absolute URI sy
  • 2. IDEA + maven + protobuf配置(on mac)

    1 絮絮叨叨 都说懒惰是人类进步的源泉 有时候想想还真就那么回事 学习了如何使用protoc命令编译 重度依赖IDEA且已经习惯了maven的我 就在想是否能在IDEA中一键编译 proto文件 2 vscode配置protobuf编辑环境
  • pyecharts实现电影数据分析可视化

    根据电影数据 使用pyecharts进行可视化分析 数据介绍 import pandas as pd data pd read csv 电影 csv data head 前5行数据如下 需要安装的python库 pip install pa
  • 2.晶晨A311D-编译Ubuntu/Debian固件

    上面是我的微信和QQ群 欢迎新朋友的加入 参考 https docs khadas com zh cn vim3 FenixScript html 编译环境 我重新安装了ubuntu20 安装软件包 配置环境 sudo apt get in
  • 【数据结构】排序(直接插入、折半插入、希尔、冒泡、快速、直接选择、堆、归并、基数排序)

    一 什么是排序 排序 将一组杂乱无章的数据按一定规律顺次排列起来 即 将无序序列的数据节点包含多个数据域 那么排序往往是针对其中某个域而言 二 排序方法的分类 1 按数据存储介质可分为 内部排序 数据量不大 数据在内存 无需内外存交换数据
  • SQL抽取数据脚本

    sp OutputData IF EXISTS SELECT 1 FROM sys objects o WHERE object id object id N sp OutputData AND OBJECTPROPERTY object
  • vue数据劫持 ajax,Vue视图更新原理 - 数据劫持,最小量更新和DIFF算法

    什么是数据劫持 加入有一个js文件内容如下 var obj x 100 y 200 Object defineProperties obj x set console log You gonna update x the vision wi
  • python smtp发送邮件 附件 中文名乱码 问题

    重点 mime add header Content Disposition attachment filename make header file name UTF 8 encode UTF 8 完整代码可以发送多个附件 import
  • 20220801:强改jar包的一下经历

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 改jar包内容 二 使用步骤 1 首先是修改的class文件 2 如何替换jar包中的class文件 总结 前言 目标是一个dubbo的服务 我们的工程引
  • VS2008错误Error spawning 'cmd.exe'的解决方法

    解决方法 In the Options go into Projects and Solutions gt VC Directories page and place this rows SystemRoot System32 System
  • Redisson配置类

    学习记录 Redisson配置类 Bean public RedissonClient redissonClient throws IOException ResourceLoader loader new DefaultResourceL
  • Dell台式机重装win 10系统之后开机报错

    电脑品牌 戴尔 报错信息 Hard disk dirve failure 硬盘驱动器故障 trick the F1 key to continue F2 to run the setup utility 报错原因 电脑一开机出现黑屏并出现H
  • Spring面向切面编程-AOP

    前言 在软件开发中 面向切面编程 Aspect Oriented Programming AOP 是一个非常重要的编程范式 Spring AOP是Spring框架提供的AOP实现 在Spring中使用AOP实现企业应用开发已经非常普遍 本文
  • 测试基础-静态白盒测试(检查代码)

    1 静态白盒测试 检查设计和代码 静态测试 测试非运行部分 检验和审查 白盒测试 访问代码 能够查看和审查 静态白盒测试 在不执行软件的条件下有条理地仔细审查软件设计 体系结构和代码 从而找出软件缺陷的过程 有时称为结构化分析 2 正式审查
  • yolov7运行自己的VOC格式数据集

    yolov7运行VOC格式数据集 代码下载 测试开发环境 使用自己的VOC格式数据集训练 修改配置文件yolov7 yaml 修改配置文件voc yaml VOC格式数据集转换COCO格式 开始训练 重头开始 fine train BUG
  • 【手写一个RPC框架】simpleRPC-03

    目录 前言 实现 项目创建 依赖配置 common service client server 文件结构 运行 本项目所有代码可见 https github com weiyu zeng SimpleRPC 前言 我们将新写一个服务接口 通
  • Ugly Numbers

    题目描述 Ugly numbers are numbers whose only prime factors are 2 3 or 5 The sequence 1 2 3 4 5 6 8 9 10 12 shows the first 1
  • 【深度学习】从LeNet-5识别手写数字入门深度学习

    活动地址 CSDN21天学习挑战赛 目录 LeNet模型 搭建环境 安装需要的包 创建工程 数据集 相关代码 可以设置GPU训练 默认CPU 通过TensorFlow下载数据集 对数据进行归一化处理 最值归一化 normalization
  • kvm创建快照与还原

    对k8s m1虚拟机创建快照 virsh snapshot create as k8s m1 20190317 查看虚拟机镜像快照的版本 virsh snapshot list k8s m1 或者 qemu img info opt kvm
  • Qt信号与槽

    信号与槽是Qt编程的基础 信号与槽在Qt中处理界面各个组件的交互操作时变得更加的直观和简单 信号 信号 Signal 就是在特定情况下被发射的事件 GUI程序设计的主要内容就是对界面上各个组件的信号进行响应 只需要知道什么情况下发射哪些信号