07.QT信号和槽-2

一、自定义信号和槽

在Qt中,允许⾃定义信号的发送⽅以及接收⽅,即可以⾃定义信号函数和槽函数。但是对于⾃定义的信号函数和槽函数有⼀定的书写规范。

1.基本语法

1.1 自定义信号

(1)⾃定义信号函数必须写到"signals"下;

(2)返回值为void,只需要声明,不需要实现;

(3)可以有参数,也可以发⽣重载;

1.2 发送信号

使⽤"emit"关键字发送信号。"emit"是⼀个空的宏。"emit"其实是可选的,没有什么含义只是为了提醒开发⼈员。

发送信号的操作可以在任意合适的位置。

1.3 自定义槽函数

(1)早期的Qt版本要求槽函数必须写到"public slots"下,但是现在⾼级版本的Qt允许写到类的"public"作⽤域中或者全局下;

(2)返回值为void,需要声明,也需要实现;

(3)可以有参数,可以发⽣重载;

二、带参数的信号和槽

  • Qt的信号和槽也⽀持带有参数,同时也可以⽀持重载。
  • 此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表⼀致。
  • 此时信号触发,调⽤到槽函数的时候,信号函数中的实参就能够被传递到槽函数的形参当中

注意:

  • 参数列表一致主要要求的是类型;
  • 参数个数不一致也可以;
  • 参数个数不一致时,要求信号的参数数量必须比槽的参数数量多;

示例:

三、信号与槽的连接方式

1.一对一

(1)一个信号连接一个槽

(2)一个信号连接另一个信号

2.一对多

一个信号连接多个槽

3.多对一

多个信号连接一个槽

四、信号与槽其他说明

1.信号与槽断开连接

使⽤disconnect即可完成断开。

disconnect的⽤法和connect基本⼀致。

2.使用Lambda表达式定义槽函数

槽函数需要在slots下声明,然后在cpp中定义,再使用connect进行连接使用,比较繁琐。对于比较简单且一次性使用的槽函数,我们也可以直接在connect时使用Lambda表达式的方式定义槽函数,更加便捷:

3.信号与槽的优缺点

3.1 优点:松耦合

信号发送者不需要知道发出的信号被哪个对象的槽函数接收,槽函数也不需要知道哪些信号关联了自己,Qt的信号槽机制保证了信号与槽函数的调⽤。⽀持信号槽机制的类或者⽗类必须继承于QObject类。

3.2 缺点:效率较低

与回调函数相⽐,信号和槽稍微慢⼀些,因为它们提供了更⾼的灵活性,尽管在实际应⽤程序中差别不⼤。通过信号调⽤的槽函数⽐直接调⽤的速度慢约10倍(这是定位信号的接收对象所需的开销;遍历所有关联;编组/解组传递的参数;多线程时,信号可能需要排队),这种调⽤速度对性能要求不是⾮常⾼的场景是可以忽略的,是可以满⾜绝⼤部分场景。

⼀个客户端程序中,最慢的环节往往是"⼈"。
假设本身基于回调的⽅式是10us,使⽤信号槽的⽅式是100us。对于使⽤程序的⼈来说,是感知不到的。

相关推荐
沫璃染墨1 天前
《Qt从零入门系列(十五):Qt线程安全与锁机制详解——从QMutex到RAII与读写锁实战》
开发语言·c++·qt·安全·交互·线程·qt6.3
小豆庄1 天前
视频脱敏引擎的追踪难题:转场误判定、ID撞号和淡入窗口
qt·算法·目标检测·音视频·视频·敏捷流程
小灰灰搞电子2 天前
Qt 中使用 QSettings 存储结构体数据详解
开发语言·qt
LaoWaiHang2 天前
关于Qt中鼠标左键事件被子控件截留的处理
qt
初阳7852 天前
【基于Qt5仿音乐播放器(一)】——项目准备
qt·1024程序员节
kaixin_learn_qt_ing3 天前
Qt开发工程师
qt
ShineWinsu3 天前
对于Qt:信号与槽的解析
c++·qt·gui·lambda·信号·信号与槽·槽函数
努力实干4 天前
Qt/C++ 模块化设计与工程组织
开发语言·c++·qt
Lhan.zzZ4 天前
Qt:动态库模块框架设计
开发语言·c++·qt
qq_401700415 天前
TCP 长连接、心跳包与断线自动重连设计:工业级通信的“不死鸟”架构
网络·qt·tcp/ip