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

Windows图形界面(GUI)-QT-C/C++ - QT信号与槽机制详解

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

Qt消息机制概述

什么是信号与槽

基本概念

信号(Signals)详解

信号的特征

信号的定义方式

槽(Slots)详解

槽的特征

槽的定义方式

信号与槽的连接

基本连接语法

连接类型

高级特性

信号与槽的重载处理

高级连接特性


Qt消息机制概述

什么是信号与槽

Qt的信号与槽(Signals & Slots)是Qt框架中最特殊和最重要的特性之一,它提供了对象之间的通信机制。这种机制比传统的回调函数更加安全和灵活。

基本概念

  • 信号(Signals): 当对象状态发生改变时发出的通知
  • 槽(Slots): 响应信号的函数
  • 连接(Connection): 信号和槽之间建立的关联

信号(Signals)详解

信号的特征

  1. 声明位置:signals关键字下
  2. 访问权限:默认protected
  3. 返回类型:必须是void
  4. 参数特点:可以有任意参数
  5. 实现特点:只需声明,无需实现

信号的定义方式

class QMySignal : public QObject  
{  
    Q_OBJECT  
public:  
    explicit QMySignal(QObject *parent = nullptr);  

signals:  
    void dataChanged();                 // 无参数信号  
    void valueChanged(int value);       // 带参数信号  
    void statusChanged(QString status, int code); // 多参数信号  
    
public:  
    void triggerSignal()  
    {  
        emit dataChanged();  // 发射信号  
    }  
};

槽(Slots)详解

槽的特征

  1. 声明位置:可在public slots、protected slots或private slots下
  2. 访问权限:根据声明位置确定
  3. 返回类型:通常为void,但可以有返回值
  4. 参数要求:需与信号参数匹配

槽的定义方式

class QMySlot : public QObject  
{  
    Q_OBJECT  
public:  
    explicit QMySlot(QObject *parent = nullptr);  

public slots:  
    void handleData()  
    {  
        qDebug() << "Data received";  
    }  
    
    void handleValue(int value)  
    {  
        qDebug() << "Value:" << value;  
    }  
    
    void handleStatus(QString status, int code)  
    {  
        qDebug() << "Status:" << status << "Code:" << code;  
    }  
};

信号与槽的连接

基本连接语法

// 基本连接方式  
connect(sender, SIGNAL(signalName()), receiver, SLOT(slotName()));  

// 新式语法(推荐)  
connect(sender, &Sender::signalName, receiver, &Receiver::slotName);

连接类型

// 直接连接  
connect(sender, &Sender::signal, receiver, &Receiver::slot,   
        Qt::DirectConnection);  

// 队列连接(跨线程)  
connect(sender, &Sender::signal, receiver, &Receiver::slot,   
        Qt::QueuedConnection);  

// 唯一连接  
connect(sender, &Sender::signal, receiver, &Receiver::slot,   
        Qt::UniqueConnection);

高级特性

信号与槽的重载处理

// 1. 使用函数指针  
void (MyClass::*mySignal)(int) = &MyClass::mySignal;  
connect(sender, mySignal, receiver, mySlot);  

// 2. 使用static_cast  
connect(sender,   
        static_cast<void(MyClass::*)(int)>(&MyClass::mySignal),  
        receiver,   
        static_cast<void(MyClass::*)(int)>(&MyClass::mySlot));  

// 3. 使用QOverload(Qt 5.7+)  
connect(sender,  
        QOverload<int>::of(&MyClass::mySignal),  
        receiver,  
        QOverload<int>::of(&MyClass::mySlot));

高级连接特性

  1. 一对多连接:一个信号可以连接多个槽
  2. 多对一连接:多个信号可以连接同一个槽
  3. 信号对信号:信号可以连接到另一个信号
// 一对多连接示例  
connect(button, &QPushButton::clicked, this, &Widget::slot1);  
connect(button, &QPushButton::clicked, this, &Widget::slot2);  

// 信号连接信号  
connect(button1, &QPushButton::clicked, button2, &QPushButton::click);


http://www.kler.cn/a/505910.html

相关文章:

  • C++实现设计模式---抽象工厂模式 (Abstract Factory)
  • 卷积神经02-CUDA+Pytorch环境安装
  • Hadoop3.x 万字解析,从入门到剖析源码
  • Python 标准库:time——时间的访问和转换
  • Docker常用命令大全
  • 【计算机网络】深入浅出计算机网络
  • Flutter中Get.snackbar和Get.dialog关闭冲突问题记录
  • C51交通控制系统的设计与实现
  • 算法3(力扣83)-删除链表中的重复元素
  • 金融数据下载
  • 启动项目报JVM初始化错误
  • United States of America三种表示
  • C++单例模式的设计
  • Tidb集群升级到8.5.0过程中服务器遇到的坑
  • rtthread学习笔记系列--32 ULOG
  • 数据结构与算法之链表: LeetCode 146. LRU 缓存 (Ts版)
  • 赛灵思(Xilinx)公司Artix-7系列FPGA
  • HP_SNMP - ilo4服务器监控指标解读
  • 数据可视化如何推动文旅行业的创新与发展
  • HTML中如何保留字符串的空白符和换行符号的效果
  • 关于SQL注入的面试题及经验分享(附视频教程)
  • 【刷题】【力扣】【178】【中等】分数排名
  • C# 25Dpoint
  • STC的51单片机LED点灯基于KEIL
  • zig语言初探:来写贪吃蛇游戏
  • 深入详解人工智能语音识别之声学模型与语言模型:掌握HMM、CTC等方法