当前位置: 首页 > 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编程中处理用户交互事件时。

相关文章:

  • 深入理解ThingsBoard的Actor模型
  • std::ratio<1,1000> 是什么意思?
  • C语言_自定义类型:结构体
  • JT/T 808 各版本协议字段级别对比与解析适配建议
  • Spring AI 集成 Mistral AI:构建高效多语言对话助手的实战指南
  • 全流量解析:让安全防御从“被动挨打”升级为“主动狩猎”
  • 【Linux网络】网络层
  • RabbitMQ 快速上手:安装配置与 HelloWorld 实践(二)
  • maven项目, idea右上角一直显示gradle的同步标识, 如何去掉
  • Restfull API 风格规则以及特点
  • Unity Image组件无法阻挡手势的解决办法
  • JS逆向实战四:某查查请求头逆向解密
  • 鸿蒙OSUniApp开发富文本编辑器组件#三方框架 #Uniapp
  • STM32F103_LL库+寄存器学习笔记23 - PWM波形输出及软件方式调整周期与占空比
  • 【行为型之访问者模式】游戏开发实战——Unity灵活数据操作与跨系统交互的架构秘诀
  • ConfigMap 和 Secret 是否支持热更新
  • Screen Mirroring App:轻松实现手机与电视的无缝投屏
  • 【C/C++】深度探索c++对象模型_笔记
  • elasticsearch硬件与资源配置优化
  • Docker 疑难杂症解决指南:从入门到进阶的全面剖析
  • 女孩患异食癖爱吃头发,一年后腹痛入院体内惊现“头发巨石”
  • 在稳市场稳预期下,投资者教育给了散户更多底气
  • 日本前卫艺术先驱群展上海:当具体派相遇古树古宅
  • 著名连环画家庞邦本逝世
  • 讲一个香港儿童的故事,《劏房的天空》获“周庄杯”特等奖
  • “无锡景・江南韵”:中国评弹艺术在尼日利亚收获众多粉丝