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

Qt 信号与槽简介

Qt是一个跨平台的C++应用程序开发框架,它提供了丰富的功能和工具来帮助开发者构建高质量、高性能的GUI应用程序。在Qt中,信号与槽(Signal and Slot)机制是一种用于处理事件的重要特性。

  1. 信号(Signal)

    • 信号是Qt对象在某种特定事件发生时发出的通知。比如,一个按钮被点击时,会发出一个"clicked"信号。
    • 信号不携带任何实现代码,它们仅仅是事件的声明。
    • Qt的许多内置控件,如QPushButtonQCheckBox等,都预定义了许多常用的信号。
  2. 槽(Slot)

    • 槽是Qt对象用于响应信号的方法或函数。当某个信号被发出时,与之相连的槽函数会被自动调用。
    • 槽可以是任何成员函数,它们可以有参数,也可以没有。
    • 与信号不同,槽带有具体的实现代码,定义了当信号发生时应该执行的操作。
  3. 信号与槽的连接

    • 在Qt中,可以使用QObject::connect()函数来连接信号与槽。这意味着当信号被发出时,与之相连的槽会被自动调用。
    • 一个信号可以连接多个槽,同样,一个槽也可以响应多个信号。
    • 信号与槽的连接可以是直接的(同步的),也可以是排队的(异步的)。
  4. 示例

假设有一个QPushButton对象(名为button)和一个自定义的槽函数(名为onButtonClicked),可以这样连接它们:

connect(button, &QPushButton::clicked, this, &MyClass::onButtonClicked);

在这个例子中,当button被点击时,onButtonClicked槽函数会被调用。

注:QObject::connect()函数的原型是 [static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection),参数Qt::ConnectionType type 就是Qt中信号与槽的连接方式。

Qt中信号与槽的连接方式有以下几种:

  1. 默认连接:也称为AutoConnection,根据信号和槽所在的对象是否在同一线程来决定连接方式。如果信号和槽在同一线程,则使用DirectConnection;如果信号和槽在不同线程,则使用QueuedConnection。
  2. 直连(DirectConnection):信号在哪,就在哪个线程执行。这种连接方式最好只在同一线程中使用。
  3. 队列连接(QueuedConnection):无论信号和槽在同一线程还是不同线程,槽函数不会立刻执行,等到接受者的当前执行的函数执行完才会执行槽函数。这种连接方式中,槽函数不会立刻执行,会等待接收对象的当前线程完成当前的任务后,在事件循环中执行。
  4. 阻塞队列连接(BlockingQueuedConnection):这种连接方式与队列连接类似,槽函数调用时机相同,只是会在发送者所在的线程会阻塞,直到槽函数运行完,发送者和接受者绝对不能在同一个线程。
  5. Qt::UniqueConnect唯一连接:一个信号只能有一个槽连接,多个会失败。可以使用|与以上四种结合使用。

5. 优点

* 解耦:信号与槽机制允许开发者将事件的产生与处理分开,提高了代码的可读性和可维护性。
* 灵活性:信号与槽的连接可以在运行时动态地建立或断开,提供了很大的灵活性。
* 跨线程通信:通过排队的连接方式,信号与槽机制可以安全地用于跨线程通信。

总之,信号与槽机制是Qt框架中处理事件的核心机制之一,它提供了一种灵活且强大的方式来响应用户的操作或其他事件的发生。


http://www.kler.cn/news/150086.html

相关文章:

  • 案例:某电子产品电商平台借助监控易保障网络正常运行
  • unity shaderGraph实例-可交互瀑布
  • C++ day45 爬楼梯 零钱兑换 完全平方数
  • 大数据基础设施搭建 - Sqoop
  • AI搜索相关性在网站和APP上的应用
  • 致远M3 反序列化RCE漏洞复现(XVE-2023-24878)
  • C++算法入门练习——数据流第K大元素
  • JavaWeb | JSP访问数据库、JDBC操作
  • 学习计划计划执行记录
  • 【数据结构】——解决topk问题
  • 存储服务器特征是什么
  • 零基础学Python的第四天||字符串(1)
  • 力扣:184. 部门工资最高的员工(Python3)
  • python getattr() setattr() hasattr() delattr()内置函数详解
  • 智慧博物馆视频监控系统设计,可视化AI智能分析技术助力博物馆多维度监管
  • SparkContext初始化
  • 错误 LNK2001 无法解析的外部符号 __imp__CrtDbgReport
  • 短 URL 生成器设计:百亿短 URL 怎样做到无冲突?
  • 2023.11.28 MyBatis 中 #{} 和 ${} 的区别
  • 【ZEDSLAM】Ubuntu18.04系统ZED 2i双目相机SDK安装、联合标定、SLAM测试
  • 离散化笔记
  • 在与客户打交道过程中为什么客户不信任你?
  • 阿里云语雀频繁崩溃,有什么文档管理工具是比较稳定的?
  • 在虚拟机搭建nignx,和使用本地访问nginx的情况
  • viple模拟器使用(三):unity模拟器中实现沿右墙迷宫算法
  • C/C++ Zlib实现文件压缩与解压
  • 集合的使用
  • leetcode:随机链表的复制
  • 【Python】获取ip
  • NTT 的各类优化:Harvey、PtNTT,Intel AVX2、ARM Neon、GPGPU