QT信号槽

ops/2024/12/28 22:23:39/

目录

概念

函数原型

实现

3.1 自带信号→自带槽

3.2 自带信号→自定义槽

3.3 自定义信号

信号槽传参

对应关系

5.1 一对多

5.2 多对一

信号槽的优势

信号槽的注意事项


概念

信号和槽是Qt框架在C++语言基础上扩展的一种机制,用于对象之间的通信。这一机制类似于其他编程技术中的回调函数。简而言之,信号槽机制可以表述为:“当A对象发生某事件时,触发B对象执行相应操作。”

信号槽机制基于以下两个前提条件:

  • 通信对象必须是QObject的派生类:QObject是所有Qt对象的基类,提供了信号槽机制的基础。
  • 类中必须包含Q_OBJECT宏:Q_OBJECT宏是Qt元对象系统的一部分,它允许使用信号槽和其他Qt特性。

函数原型

信号槽的“约定”通过连接函数实现,以下为连接函数的原型:

cpp

复制

解释

QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * slot)[static]

  • 参数1(sender):发射信号的对象,通常是名词(如“小钱”)。
  • 参数2(signal):发射的信号函数,通常是一个动词函数(如“考了100分”),需使用SIGNAL()宏包裹。
  • 参数3(receiver):接收信号的对象,通常是名词(如“小张”)。
  • 参数4(slot):接收信号后执行的槽函数,通常是一个动词函数(如“请吃饭”),需使用SLOT()宏包裹。

实现

信号槽的实现可以分为以下三种方式:

3.1 自带信号→自带槽

这是最简单的连接方式,因为信号和槽函数都是Qt内置的。只需查找相应的函数,并使用connect函数进行连接。

3.2 自带信号→自定义槽

Qt不可能内置所有可能的动作代码,特别是复杂的操作。开发者需要手动编写槽函数。这种方式在实际开发中非常常见。

3.3 自定义信号

自定义信号用于特定场景,信号函数只有声明没有定义,只能通过emit关键字发射。

信号槽传参

信号槽可以传递参数,使得槽函数能够根据不同的信号执行不同的操作。需要注意的是:

  • 理论上可以传递任意多个参数,但实际应用中通常传递1-2个。
  • 信号的参数个数必须大于等于槽函数的参数个数。
  • 信号的参数类型必须与槽函数的参数类型匹配。

对应关系

5.1 一对多

一个信号可以连接到多个槽函数。这种方式提供了灵活性,可以单独处理每个信号槽的连接。

5.2 多对一

多个信号可以连接到同一个槽函数。在槽函数中,可以通过sender()函数来判断是哪个信号触发了槽函数。

信号槽的优势

信号槽机制具有以下优势:

  • 解耦:发射信号的对象不需要知道哪个槽会接收信号,从而降低了对象之间的耦合度。
  • 灵活性:信号槽机制允许在运行时动态地连接和断开信号与槽。
  • 类型安全:信号槽的参数类型检查保证了类型安全。
信号槽的注意事项

在使用信号槽时,应注意以下几点:

  • 确保信号和槽的参数类型匹配。
  • 避免在信号槽连接中直接操作UI元素,因为这可能导致在错误的线程中更新UI。
  • 断开不再需要的信号槽连接,以避免内存泄漏。

信号和槽机制是Qt框架的核心特性之一,它不仅支持基本的用法,还提供了一些高级特性来满足更复杂的需求。

使用方法:

  1. 信号连接的断开

    • 使用disconnect()函数可以断开已经建立的信号和槽的连接。
    • 可以指定断开特定信号和槽的连接,或者断开一个对象的所有连接。
  2. 信号与槽的参数映射

    • 可以使用QSignalMapper类将多个信号映射到一个槽函数,通过参数来区分不同的信号来源。
  3. 信号与槽的自动连接

    • 使用QMetaObject::connectSlotsByName()函数可以根据对象名和槽函数名自动建立信号和槽的连接。
  4. 信号与槽的跨线程连接

    • 在多线程应用程序中,可以使用Qt::QueuedConnection类型的连接来确保信号和槽在不同的线程之间安全地传递。
  5. 自定义信号和槽

    • 开发者可以定义自己的信号和槽,使用emit关键字发射信号,槽函数可以是普通成员函数、静态成员函数甚至是全局函数。
  6. 信号的重载

    • 如果类中有重载的信号,需要使用SIGNAL()SLOT()宏来指定具体的信号和槽,因为它们需要额外的信息来区分重载版本。
  7. 信号的连接和断开的控制

    • 可以使用blockSignals()函数暂时阻止对象发射信号。
    • 使用QObject::dumpObjectTree()QObject::dumpObjectInfo()函数来调试信号和槽的连接。
  8. 信号连接的优先级

    • 在使用Qt::DirectConnection时,信号的接收者将按照信号连接的顺序来调用槽函数。可以通过重新连接信号来改变调用顺序。
  9. 信号的聚合

    • 可以使用QSignalSpy类来监视信号,它能够捕获信号发射的所有参数,这对于单元测试特别有用。
  10. 信号的转发

    • 在某些情况下,可能需要将一个信号转发给另一个信号,这可以通过在槽函数中使用emit来实现。
  11. 信号的参数类型转换

    • 可以使用qRegisterMetaType()函数注册自定义类型,使得这些类型可以作为信号和槽的参数。
  12. 信号槽的异常处理

    • 在槽函数中,可以添加异常处理逻辑,以确保信号的处理不会导致程序崩溃。

http://www.ppmy.cn/ops/144608.html

相关文章

SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常适…

如何在电脑上控制手机?

在现代生活中,通过电脑控制手机已经成为一种高效的工作和娱乐方式。Total Control 是一款实用的电脑端软件,通过USB或Wi-Fi连接,用户可以在电脑上直接操作多台手机,通过电脑键盘输入文字,提高操作效率。特别适合需要大屏操作的用户…

MySQL篇之对MySQL进行参数优化,提高MySQL性能

1. MySQL参数优化说明 MySQL 参数调优是提高数据库性能的重要手段之一。通过调整 MySQL 的配置参数,可以优化查询速度、提升并发处理能力、减少资源消耗等。 MySQL 的性能优化涉及到多个方面,包括内存管理、磁盘 I/O、查询优化、连接管理、复制配置等。…

Apache Tomcat 漏洞CVE-2024-50379条件竞争文件上传漏洞 servlet readonly spring boot 修复方式

1,关于漏洞 Apache Tomcat是一个流行的开源 Web 服务器和 Java Servlet 容器。 二、 漏洞描述 Apache Tomcat中修复了个 TOCTOU 竞争条件远程代码执行漏洞 (CVE-2024-50379),该漏洞的 CVSS 评分为 9.8。Apache Tomcat 中 JSP 编译期间存在检查时间使用时…

xcode15 报错 does not contain ‘libarclite‘

新建pod私有库 在xcode15 无法运行 报错 SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a; try increasing the minimum deployment target 下载 资源文件…

mHandPro 动捕手套:在具身智能、VR互动及仿真教学中的卓越表现

广州虚拟动力高精度惯性动捕手套mHandPro,集成16个传感器以及第二代自主研发多层级AHRS异步融合算法,定制化设计了16位ADC ASIC,保持了在温度和时间层面上动捕数据的高稳定性,具备低噪声、高精度和偏移抵消的优点。动捕手套能够实…

PostgreSQL表达式的类型

PostgreSQL表达式是数据库查询中非常重要的组成部分,它们由一个或多个值、运算符和PostgreSQL函数组合而成,用于计算出一个单一的结果。这些表达式类似于公式,可以用查询语言编写,并用于查询数据库中的特定数据集。 PostgreSQL表…

VScode中配置ESlint+Prettier详细步骤(图文详情)

VScode中配置ESlintPrettier详细步骤(图文详情) 前置环境: node 18.19.0 vite 3.2.11 vue 3.2.47 本文将不在演示vue3基础工程创建,如果还没有vue3项目工程请参考文章: Vite创建Vue3工程并引入ElementPlus&#x…