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

QT之信号与槽

欢迎来到 破晓的历程的 博客

⛺️不负时光,不负己✈️

文章目录

  • QT信号与槽机制详解
    • 基本概念
      • 信号(Signal)
      • 槽(Slot)
    • 信号与槽的连接方式
      • 基本语法
      • QT5新语法(推荐)
    • 信号与槽的特点
    • 实际示例
      • 传统方式
      • QT5新语法
    • 连接类型
    • 注意事项
    • 高级用法
      • 信号连接信号
      • 使用lambda表达式
      • 自动断开连接(QT5)
      • 自动断开连接(QT5)

QT信号与槽机制详解

QT的信号与槽机制是其核心特性之一,提供了一种强大的对象间通信方式,比传统的回调函数更加灵活和安全。

基本概念

信号(Signal)

  • 信号是QT中由QObject派生类可以发出的通知
  • 信号只有声明没有实现,由moc(元对象编译器)自动生成
  • 信号可以带有任意数量和类型的参数
  • 信号使用emit关键字触发

槽(Slot)

  • 槽是普通的C++成员函数,可以被正常调用
  • 槽可以连接到信号,当信号发出时自动调用
  • 槽可以有参数,但参数类型必须与连接的信号兼容
  • 槽可以有返回值,但通常被忽略(因为信号没有返回值)

信号与槽的连接方式

基本语法

QObject::connect(sender,    // 发送对象指针SIGNAL(signalSignature),  // 信号签名receiver,  // 接收对象指针SLOT(slotSignature)   // 槽签名
);

QT5新语法(推荐)

QObject::connect(sender,        // 发送对象指针&SenderClass::signalName,  // 信号成员函数指针receiver,      // 接收对象指针&ReceiverClass::slotName   // 槽成员函数指针
);

信号与槽的特点

  1. 类型安全:参数类型必须匹配,编译时检查(QT5语法)
  2. 松耦合:发送者不知道接收者信息
  3. 多对多:一个信号可以连接多个槽,一个槽可以接收多个信号
  4. 线程安全:支持跨线程通信
  5. 自动断开:当对象被删除时,连接自动断开

实际示例

传统方式

// 定义包含信号和槽的类
class MyClass : public QObject {Q_OBJECT
public:explicit MyClass(QObject *parent = nullptr);signals:void valueChanged(int newValue);public slots:void setValue(int value);
};// 连接信号与槽
MyClass obj1, obj2;
QObject::connect(&obj1, SIGNAL(valueChanged(int)), &obj2, SLOT(setValue(int)));// 触发信号
obj1.valueChanged(42);  // 这将调用obj2.setValue(42)

QT5新语法

// 连接
QObject::connect(&obj1, &MyClass::valueChanged, &obj2, &MyClass::setValue);// 也可以使用lambda表达式
QObject::connect(&obj1, &MyClass::valueChanged, [](int value) {qDebug() << "Value changed to:" << value;
});

连接类型

QT提供了不同的连接类型:

Qt::AutoConnection      // 默认(同线程直接连接,跨线程队列连接)
Qt::DirectConnection    // 直接调用,在发送者线程执行
Qt::QueuedConnection    // 异步,在接收者线程执行
Qt::BlockingQueuedConnection  // 同步,在接收者线程执行并阻塞发送者线程
Qt::UniqueConnection    // 唯一连接,防止重复连接

注意事项

  1. 使用信号和槽的类必须在类声明中包含Q_OBJECT
  2. 信号和槽的参数类型必须是QT元对象系统认识的类型,或使用qRegisterMetaType()注册
  3. 槽函数可以有默认参数,但信号不能有
  4. 信号与槽的效率比直接函数调用稍低,但提供了更大的灵活性

高级用法

信号连接信号

// 当signal1发出时,自动触发signal2
connect(obj1, &Class1::signal1, obj2, &Class2::signal2);

使用lambda表达式

connect(button, &QPushButton::clicked, [=]() {// 处理点击事件
});

自动断开连接(QT5)

// 当接收者被删除时自动断开
connect(sender, &Sender::signal, receiver, &Receiver::slot, Qt::UniqueConnection);

自动断开连接(QT5)

// 当接收者被删除时自动断开
connect(sender, &Sender::signal, receiver, &Receiver::slot, Qt::UniqueConnection);

信号与槽机制是QT框架中最强大和独特的特性之一,它极大地简化了对象间的通信,特别是在GUI编程中处理用户交互事件时。

http://www.xdnf.cn/news/437869.html

相关文章:

  • 嵌入式设计模式基础--C语言的继承封装与多态
  • Java 性能调优全解析:从设计模式到 JVM 的 7 大核心方向实践
  • 初学c语言14(指针6)
  • 用模型预测控制算法实现对电机位置控制仿真
  • 深入浅出入侵检测系统(IDS)的工作原理与应用场景
  • TTS-Web-Vue系列:Vue3实现内嵌iframe文档显示功能
  • Ubuntu24.04编译ORB_SLAM的一系列报错解决
  • 数字取证-内存取证(volatility)
  • 使用VSCode编辑Markdown+PlantUml
  • 前端面试宝典---js垃圾回收机制
  • “海外滴滴”Uber的Arm迁移实录:重构大规模基础设施​
  • 知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑
  • 广东省省考备考(第十天5.14)—言语(第三节课)
  • deepseek梳理java高级开发工程师算法面试题
  • C++23 中的 ranges::starts_with 与 ranges::ends_with
  • Go语言中的函数类型参数:深入理解`func()`
  • 编程日志5.6
  • 比亚迪固态电池突破:王传福的技术哲学与产业重构|创客匠人热点评述
  • 部署安装gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm
  • PyQt5基本窗口控件(QComboBox(下拉列表框))
  • AI开发者的算力革命:GpuGeek平台全景实战指南(大模型训练/推理/微调全解析)
  • 注解和 XML 两种方式有什么区别?
  • hudi + flinksql 处理 金额汇总的实时场景
  • Flink实时统计任务CPU异常排查与解决方案
  • Thrust库中的Gather和Scatter操作
  • 【​​HTTPS基础概念与原理​】​​HTTPS vs HTTP:为什么现代网站必须用HTTPS?
  • 元宇宙赛道新势力:成都芯谷产业园创新业务如何重构产业格局
  • 5.18-AI分析师
  • 【RabbitMq C++】消息队列组件
  • 人工智能外呼系统:重构智能交互的全维度进化