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

QT核心————信号槽

信号槽

1、概念
信号和槽是两个函数,这是Qt在C++基础上新增的特性。类似于其他技术中的回调的概念。
信号槽通过程序员提前设定的“约定”,可以实现对象之间的通信,有两个先决条件。
● 通信的对象必须都是从QObject类中派生出来的。
● 类中要有Q_OBJECT宏。
2、函数原型
信号槽需要在使用前进行约定,这个约定也被称之为连接,使用connect函数进行连接。

// 参数1:发射者

// 参数2:信号函数,表示发射者发起的动作。SIGNAL()包裹。必须是发射者所属类内的函数

// 参数3:接收者

// 参数4:槽函数,表示接收者要履行的约定,使用SLOT()包裹。必须是接受者类内的函数!

connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method)

[static]

【注意】
1)信号函数必须是发射者所属类(或者发射者的基类)的成员函数;同理槽函数必须是接受者所属类(或接受者的基类)的成员函数!
2)connect()写两次,就是一次发射者的动作(信号函数),接受者两次执行槽函数!
第五个参数:
第五个参数type就是用来指定连接的类型。它可以是以下几种枚举值之一:
Qt::AutoConnection:Qt将自动选择连接类型。如果信号和槽在同一线程中,那么使用Qt::DirectConnection,否则使用Qt::QueuedConnection。
Qt::DirectConnection:直接连接。当信号发出时,槽函数会立即在发射信号的线程上被调用。这意味着如果信号和槽位于不同线程,那么可能会出现线程安全问题。
Qt::QueuedConnection:队列连接。当信号发出时,Qt会将事件放入接收对象的事件队列中,然后等待目标对象所在的线程处理该事件。因此,槽函数的执行将延迟到接收对象所在的线程中执行,这通常用于跨线程连接。
Qt::BlockingQueuedConnection:阻塞队列连接。与Qt::QueuedConnection类似,但是发送者将被阻塞,直到接收者处理完槽函数为止。
Qt::UniqueConnection:确保每个连接只建立一次,避免重复连接。
connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)
【注意】
1)参数五:
跨线程:队列链接
同线程:直接链接
3、实现方式
为了学习,把信号槽分为三种实现方式:
● 自带信号→自带槽
● 自带信号→自定义槽
● 自定义信号
(一)自带信号→自带槽
(二)自带信号→自定义槽
Qt不可能内置所有执行的动作代码,特别是复杂的动作,需要开发者手动编写槽函数,这种方式也是所有连接方式中使用最多的。
槽函数实际上是一种特殊的成员函数,在声明的时候权限的作用主要是修饰其作为普通成员函数的使用效果,不影响信号槽的连接效果。
【注意】
1)自定义的槽函数:不可以只写声明,不实现,会直接报错的。 

http://www.dtcms.com/a/299215.html

相关文章:

  • Qt 多线程编程最佳实践
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——6. 传统算法实战:用OpenCV测量螺丝尺寸
  • 基于粒子群算法优化高斯过程回归(PSO-GPR)的多输出回归
  • 数据科学与大数据技术专业的核心课程体系及发展路径全解析
  • Jenkins运行pytest时指令失效的原因以及解决办法
  • Java集合体系详解
  • docker常用命令集(3)
  • 【守护】同为科技SPD:AP-20D/4P产品解析
  • C语言--青蛙跳台阶问题
  • 《聪明人的个人成长》读书笔记
  • DAY31 整数矩阵及其运算
  • FitCoach AI:基于React+CloudBase的智能健身教练应用开发全解析
  • LeetCode 1074:元素和为目标值的子矩阵数量
  • Qt 网络编程进阶:网络安全与加密
  • Spring Cloud Gateway:微服务架构下的 API 网关详解
  • GRE及MGRE应用综合实验
  • ICMPv4报文类型详解表
  • OpenCV学习探秘之二 :数字图像的矩阵原理,OpenCV图像类与常用函数接口说明,及其常见操作核心技术详解
  • 生猪产业新生态:结构调整与种养结合,筑牢农业强国根基
  • Linux内核设计与实现 - 课程大纲
  • Android WorkManager 详解:高效管理后台任务
  • Ruby 数据库访问 - DBI 教程
  • 基于深度学习的胸部 X 光图像肺炎分类系统(七)
  • 基于POD和DMD的压气机叶片瞬态流场分析与神经网络预测
  • java8 List常用基本操作(去重,排序,转换等)
  • 联表实现回显功能
  • 经典IDE之Turbo C
  • HAProxy 实验指南:从零开始搭建高可用负载均衡系统
  • haproxy原理及实战部署
  • AI Agent开发学习系列 - LangGraph(2): 用LangGraph创建我们的第一个Agent(练习解答)