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

ops/2025/1/15 12:59:24/
  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

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.ppmy.cn/ops/150290.html

相关文章

SQLite 语法快速入门

SQLite 是一个软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 提供一个免费的在线SQLite编辑器 &#xff08;0&#xff09;常用命令 # 格式化 .header on .mode column .timer on# 查看表格 .tables# 查看表结构(建表语句) .schema …

纯 Python、Django、FastAPI、Flask、Pyramid、Jupyter、dbt 解析和差异分析

一、纯 Python 1.1 基础概念 Python 是一种高级、通用、解释型的编程语言&#xff0c;以其简洁易读的语法和丰富的标准库而闻名。“纯 Python” 在这里指的是不依赖特定的 Web 框架或数据分析工具&#xff0c;仅使用 Python 原生的功能和标准库来开发应用程序或执行任务。 1.…

今年的电商年货节,主流的营销策略是怎样?

随着一年的年关将近&#xff0c;新一年的CNY营销也逐渐拉开帷幕。考虑到此时消费需求的膨胀&#xff0c;这个时间不论对于线上还是线下市场而言&#xff0c;都是重要的营销节点。今年CNY营销&#xff0c;电商平台上的主流营销策略是这样&#xff1f;就让我们来简单了解下概况。…

谷歌浏览器的音视频播放设置与优化

在数字媒体时代&#xff0c;音视频内容已成为人们日常生活中不可或缺的一部分。作为最流行的网络浏览器之一&#xff0c;谷歌浏览器凭借其强大的功能和灵活的设置选项&#xff0c;为用户提供了卓越的音视频播放体验。本文将详细介绍如何通过优化谷歌浏览器设置来提升音视频播放…

Mac Mini 最优雅的备份方式:使用极空间实现自动整机备份

Mac Mini 最优雅的备份方式&#xff1a;使用极空间实现自动整机备份 哈喽小伙伴们好&#xff0c;我是Stark-C~ 目前Mac mini M4到手已经一个多月&#xff0c;处理器性能大幅提升&#xff0c;内存也是破天荒的翻倍升级&#xff0c;再加上国补之后3500左右的价格&#xff0c;真…

Mybatis-底层是如何解决sql注入增删改查操作--删除操作

目录 什么是sql注入&#xff1f; SQL注入如何解决&#xff1f; 如何在Mybatis 中实现删除操作&#xff1f; 方式一&#xff1a; 方式二&#xff1a; 编写单元测试方法进行测试&#xff1a; 小结&#xff1a; 什么是sql注入&#xff1f; SQL注入&#xff1a;通过控制输入…

如何规模化实现完全自动驾驶?Mobileye提出解题“新”思路

在CES 2025上&#xff0c;Mobileye展示了端到端自动驾驶系统Mobileye Drive™&#xff0c;通过高度集成的传感器、算法和计算平台&#xff0c;可以实现自动驾驶功能的全覆盖。 Mobileye创始人兼首席执行官Amnon Shashua教授 期间&#xff0c;Mobileye创始人兼首席执行官Amnon …

linux手动安装mysql5.7

一、下载mysql5.7 1、可以去官方网站下载mysql-5.7.24-linux-glibc2.12-x86_64.tar压缩包&#xff1a; https://downloads.mysql.com/archives/community/ 2、在线下载&#xff0c;使用wget命令&#xff0c;直接从官网下载到linux服务器上 wget https://downloads.mysql.co…