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

QT —— 信号和槽(自定义信号和槽函数)

QT —— 信号和槽(自定义信号和槽函数)

  • 自定义信号和槽函数
    • 一、自定义信号函数规范
      • 1. 声明位置
      • 2. 返回值与实现
      • 3. 参数与重载
    • 二、自定义槽函数规范
      • 1. 声明位置(不同版本差异)
      • 2. 返回值与实现
      • 3. 参数与重载
    • 三、信号发射规范
      • 1. 基本用法
      • 2. 为什么要用emit
    • 四、完整示例

之前我们简单了解了一下信号和槽,没有看过上一节的小伙伴可以看一下:

https://blog.csdn.net/qq_67693066/article/details/147275998?sharetype=blogdetail&sharerId=147275998&sharerefer=PC&sharesource=qq_67693066&spm=1011.2480.3001.8118

我们上一节大多使用的是按钮自带的信号或者槽函数,其实我们可以自己定义信号和槽函数。

自定义信号和槽函数

在Qt中自定义信号和槽函数需要遵循特定的语法规范:

一、自定义信号函数规范

1. 声明位置

  • 必须声明在类的signals:区块下
  • 示例:
    class MyClass : public QObject {Q_OBJECT
    signals:  // 信号声明区void mySignal();void dataReceived(const QByteArray &data);
    };
    
    在这里插入图片描述

2. 返回值与实现

  • 必须返回void类型
  • 只需声明,不需要实现(由moc自动生成实现)
  • 错误示例:
    signals:int invalidSignal();  // 错误!信号必须返回voidvoid anotherSignal() { /* 实现 */ }  // 错误!信号不能有实现
    

3. 参数与重载

  • 可以带参数,支持重载
  • 示例:
    signals:void valueChanged(int newValue);void valueChanged(double newValue);  // 重载信号
    

二、自定义槽函数规范

1. 声明位置(不同版本差异)

  • Qt4及早期版本

    class MyClass : public QObject {Q_OBJECT
    public slots:  // 必须声明在slots区块void mySlot();
    };
    
  • Qt5及以后版本

    class MyClass : public QObject {Q_OBJECT
    public:  // 可以声明在public区域void mySlot();  // 可作为槽函数
    };
    

    在这里插入图片描述

2. 返回值与实现

  • 通常返回void(但也可以有返回值)
  • 必须提供实现
  • 示例:
    // 声明
    public slots:void processData(const QString &data);int computeResult();  // 允许但不推荐// 实现
    void MyClass::processData(const QString &data) {// 实现代码
    }
    

3. 参数与重载

  • 可以带参数,支持重载
  • 示例:
    public slots:void setValue(int value);void setValue(double value);  // 重载槽
    

三、信号发射规范

1. 基本用法

  • 使用emit关键字(实际是可选的宏)
  • 示例:
    void MyClass::updateValue(int val) {m_value = val;emit valueChanged(val);  // 推荐使用emitvalueChanged(val);       // 这样也可以,但不推荐
    }
    

2. 为什么要用emit

  • 代码可读性:明确标识这是信号发射点
  • 开发提示:提醒开发者这是跨对象的通信点
  • 虽然不是强制要求,但是良好的编程习惯

四、完整示例

我们可以来试一下,我已经加了一个我自己定义的信号:
在这里插入图片描述

现在我们到cpp文件中使用一下:

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,&Widget::MySignal,this,&Widget::handler);emit MySignal();}void Widget::handler()
{qDebug() << "这是我自己定义的槽函数";
}Widget::~Widget()
{delete ui;
}

在这里插入图片描述

这里要注意一下顺序:
在这里插入图片描述
原因是,首先关联信号和槽,一旦检测到信号发射之后就会立马执行关联的槽函数。反之,若先发射信号,此时还没有关联槽函数,当信号发射之后槽函数不会响应。

我们再来写一个例子:当老师说"上课了",学生们就"回到座位,开始学习":
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在teacher.h中声明信号函数:
在这里插入图片描述
在student.h中声明槽函数:
在这里插入图片描述
在widget.h中实例化"老师类对象"和"学生类对象";
在这里插入图片描述
在student.cpp中实现槽函数:
在这里插入图片描述
在widget.cpp中连接⾃定义信号和槽;
在这里插入图片描述
在这里插入图片描述

相关文章:

  • 《Timer: Generative Pre-trained Transformers Are Large Time Series Models》
  • C++Cherno 学习笔记day20 [81]-[85] 可视化基准测试、单例模式、小字符串优化sso、跟踪内存分配、左值与右值
  • 蓝桥杯B组Java省赛强化
  • Cribl (实验) vpc-flow 数据抽样
  • 中科院1区顶刊Expert Systems with Applications ESO:增强型蛇形算法,性能不错
  • LeetCode -- Flora -- edit 2025-04-16
  • Numpy常用库方法总结
  • Langchain + Gemini API调用基本操作
  • MGR实现mysql高可用性
  • JVM:垃圾回收
  • JVM:运行时数据区和线程
  • 【计算机方向】中科院双一区TOP顶刊,IF=14.7,Nature招牌1区Top,中一篇直接就稳了!
  • map用法介绍
  • 前沿计组知识入门(六)
  • Arkts应用全局UI状态存储和持久化V2(AppStorageV2、PersistenceV2和@Type)
  • Idea集成AI:CodeGeeX开发
  • 【Leetcode-Hot100】缺失的第一个正数
  • 【LangChain核心组件】Memory:让大语言模型拥有持续对话记忆的工程实践
  • 杭电oj(2013-2028)题解
  • 100个GEO基因表达芯片或转录组数据处理023.GSE24807
  • 哪些网站可以免费做推广呢/域名注册网站查询
  • 自己做副业可以抢哪个网站/口碑营销的概念是什么
  • 一家只做家纺的网站/seo网站怎么优化
  • 淘宝客网站建设视频教程/最大的推广平台
  • 企业网站建设代理加盟/点击精灵seo
  • 国外教程 网站/吉林百度查关键词排名