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

QT自定义信号槽

1.自定义信号槽

使用connect()可以让我们连接系统提供的信号和槽,同时也可以自定义信号槽。

例如以学生和老师构建类同时当老师触发信号下课同学收到信号执行“吃饭”这一动作代码示例

#include "SignalAndSlot.h"
//Teacher       Student     总框架类用以实现自定义信号槽
SignalAndSlot::SignalAndSlot(QWidget *parent): QWidget(parent)
{ui.setupUi(this);this->zt = new Teacher(this);this->st = new Student(this);connect(this->zt, &Teacher::Hungry, this->st, &Student::treat);classover();
}SignalAndSlot::~SignalAndSlot()
{}void SignalAndSlot::classover()
{//触发自定义的信号emit this->zt->Hungry();}
#pragma once#include <QObject>   //老师类class Teacher  : public QObject
{Q_OBJECTpublic:Teacher(QObject* parent = 0);~Teacher();
signals:	//自定义信号   写到signala下//1.返回值类型是void//2.只需要声明,不需要实现//3.可以有参数,可以发生重哉void Hungry();
};
#pragma once#include <QObject>  //学生类class Student : public QObject
{Q_OBJECTpublic:Student(QObject* parent = 0);~Student();public slots://槽函数  写到public slots下,或者public,或者全局函数,或者lambda//返回值  void//需要声明   需要实现//可以有参数  可以重载void treat();
};

解释:
1.只有继承了QObject类的类,才具有信号槽的能力。为了使用信号槽,必须继承QObject。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。
2.信号就是一个个的函数名,返回值是 void(因为无法获得信号的返回值,所以也就无需返回任何值),参数是该类需要让外界知道的数据。信号作为函数名,不需要在 cpp 函数中添加任何实现。
3.emit 是 Qt 对 C++ 的扩展,是一个关键字(其实也是一个宏)。emit 的含义是发出,也就是发出Hungry()信号,感兴趣的接收者会关注这个信号。
注意点:
 发送者和接收者都需要是QObject的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外);
 使用 signals 标记信号函数,信号是一个函数声明,返回 void,不需要实现函数代码;
 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;
 使用 emit 在恰当的位置发送信号;
 使用QObject::connect()函数连接信号和槽。
 任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数

2.信号和槽重载的问题以及解决

当发生重载的时候要加上函数指针防止程序出现二义性

  //连接有参数的信号和槽 //要用函数指针   指向  函数地址//这里是以QString类型参数重载的void(Teacher:: * teacherSignal)(QString) = &Teacher::Hungry;void(Student:: * studentSlot)(QString) = &Student::treat;connect(this->zt, teacherSignal, this->st, teacherSignal);

//QString转char*
先调用toUtf-8转为QByteArray
在调用data 转为char*

3. 信号和槽拓展

//1.信号连接信号

    void(Teacher:: * teacherSignal1)() = &Teacher::Hungry;void(Student:: * studentSlot1)() = &Student::treat;connect(this->zt, teacherSignal1, this->st, studentSlot1);connect(btn, &QPushButton::clicked, this->zt, teacherSignal1);

//2.一个信号可以连接多个槽函数
//3.多个信号可以连接同一个槽函数
//4.信号和槽的参数类型必须一一对应(信号和槽的参数类型必须一样)
//5.信号的参数个数可以多余槽函数,反之不可以,类型相同个数的参数类型也要按顺序一一对应
//6.可以利用disconnect 断开信号槽连接(参数同connect一样)

4.信号连接信号接收信号有参数的连接方式
在Qt中,‌当你使用信号和槽机制时,‌信号的发射(‌emit)‌会自动将信号所带的参数传递给槽函数或另一个信号。‌如果你想要在某个信号发射时传递特定的参数给另一个信号或槽,‌你需要在连接信号和槽时确保它们的参数是匹配的。‌

对于你给出的代码段,‌teacherSignal1 是一个指向 Teacher 类中 Hungry 信号的指针,‌该信号接受一个 QString 类型的参数。‌同样,‌studentSlot1 是一个指向 Student 类中 treat 槽的指针,‌该槽也接受一个 QString 类型的参数。‌

当你连接 btn 的 clicked 信号到 teacherSignal1 时,‌你需要确保在发射 teacherSignal1 时传递一个 QString 类型的参数。‌然而,‌QPushButton 的 clicked 信号并不传递任何参数,‌所以你需要使用一种方法来在连接时或信号发射时提供这个参数。‌

一种常见的做法是使用一个中间槽,‌该槽在接收到 clicked 信号时被调用,‌并在其中发射 teacherSignal1,‌同时传递所需的 QString 参数。‌例如:‌

class MyClass : public QObject {Q_OBJECT
public:MyClass() {connect(btn, &QPushButton::clicked, this, &MyClass::onButtonClicked);connect(this, &MyClass::teacherSignal1, this->zt, teacherSignal1);connect(this->zt, teacherSignal1, this->st, studentSlot1);}public slots:void onButtonClicked() {emit teacherSignal1("I'm hungry!");}signals:void teacherSignal1(QString message);private:QPushButton *btn;Teacher *zt;Student *st;
};

在这个例子中,‌MyClass 有一个槽 onButtonClicked,‌它在 btn 被点击时被调用。‌在这个槽中,‌我们发射了 teacherSignal1 信号,‌并传递了一个 QString 类型的参数 “I’m hungry!”。‌然后,‌teacherSignal1 信号被连接到 Teacher 类的 Hungry 信号,‌最终 Hungry 信号被连接到 Student 类的 treat 槽。‌这样,‌当按钮被点击时,‌消息就会从 btn 传递到 st 的 treat 槽。‌

相关文章:

QT自定义信号槽

1.自定义信号槽 使用connect()可以让我们连接系统提供的信号和槽&#xff0c;同时也可以自定义信号槽。 例如以学生和老师构建类同时当老师触发信号下课同学收到信号执行“吃饭”这一动作代码示例 #include "SignalAndSlot.h" //Teacher Student 总框架…...

one-shot 序列图像红外小目标分割

one-shot 序列图像红外小目标分割 IEEE TRANSACTIONS ON GEOSCIENCE AND REMOTE SENSING 代码还未开源 GitHub - D-IceIce/one-shot-IRSTS few-shot&#xff1a;利用少量标注样本进行学习 one-shot: 属于few-shot的特殊情况&#xff0c;只用一个样本进行学习 zero-shot&am…...

JavaScript 单线程防阻塞的原理

JavaScript 是一种单线程语言,这意味着它一次只能执行一个任务。这种设计可能会导致一些问题,比如当遇到耗时的操作时,整个程序可能会被阻塞。为了解决这个问题,JavaScript 使用了事件循环和回调函数的机制,实现了非阻塞式的异步操作。 事件循环 JavaScript 有一个事件队列,用…...

Shell脚本发送邮件的详细步骤与配置方法?

Shell脚本发送邮件的进阶技巧&#xff1f;怎么配置Shell脚本发信&#xff1f; 使用Shell脚本发送邮件是一种高效的自动化手段&#xff0c;特别是在需要定期发送报告、通知或警告信息时。AokSend将详细介绍Shell脚本发送邮件的步骤与配置方法&#xff0c;帮助您更好地掌握这一技…...

如何把Phalcon 集成到PhpStorm里面

一 背景 按照上一篇文章里面写的Phalcon 创建项目过程中的一些坑, 最终我们在终端可以基于Phalcon命令创建对应的开发项目。但在这个过程中,存在一个问题:那就是写代码的时候,发现Phalcon对应的依赖提示都没有,如下: 从上面这个截图来看,就能发现,Phalcon的啥…...

python从入门到精通:循环语句

目录 前言 1、while循环的基础语法 2、while循环的嵌套 3、for循环的基础语法 range语句&#xff1a; for循环临时变量作用域&#xff1a; 4、for循环的嵌套 5、循环中断&#xff1a;break和continue 前言 循环普遍存在于日常生活中&#xff0c;同样&#xff0c;在程序中…...

Codeforces Round 965 (Div. 2)

前言 有人在过七夕&#xff0c;我在打 cf &#xff0c;还有某人独自一人在学校机房&#xff0c;凌晨一点骑上共享单车回宿舍欣赏沿途的秋风扫落叶。 Standings&#xff1a;2166 题目链接&#xff1a;Dashboard - Codeforces Round 965 (Div. 2) - Codeforces A. Find K Distin…...

Win10下载安装Mysql服务

Win10下载安装MySQL 一、官网下载MySQL 1.官网地址&#xff1a; https://www.mysql.com/ 2.在官网首页拉到最下方&#xff0c;点击MySQL Community Server&#xff1a; 3.根据个人电脑的操作系统选择&#xff0c;此处以Windows x64为例&#xff0c;选择第2个&#xff0c;点击…...

MVVM(Model-View-ViewModel)架构模式

在Android开发中&#xff0c;MVVM&#xff08;Model-View-ViewModel&#xff09;架构模式已经成为构建可维护和可扩展应用程序的重要选择。MVVM模式通过分离视图&#xff08;View&#xff09;、模型&#xff08;Model&#xff09;和视图模型&#xff08;ViewModel&#xff09;来…...

C#MVC返回DataTable到前端展示。

很久没写博客了&#xff0c;闭关太久&#xff0c;失踪人口回归&#xff0c;给诸位道友整点绝活。 交代下背景&#xff1a;要做一个行转列的汇总统计&#xff0c;而且&#xff0c;由于是行转列&#xff0c;列的数量不固定&#xff0c;所以&#xff0c;没法使用正常的SqlSugar框…...

HttpUtils工具类(二)Apache HttpClient 5 使用详细教程

目录 一、Apache HttpClient 5介绍 &#xff08;1&#xff09;核心特性 &#xff08;2&#xff09;Apache HttpClient 5 的新特性 &#xff08;3&#xff09;在 Java 项目的主要使用场景及缺点 使用场景&#xff1a; 缺点&#xff1a; 二、在实际项目中的应用 &#xf…...

Vue3.0生命周期钩子(包含:Vue 2.0 和 Vue 3.0)

1、Vue 2.0 生命周期钩子 每个应用程序实例在创建时都有一系列的初始化步骤。例如&#xff0c;创建数据绑定、编译模板、将实例挂载到 DOM 并在数据变化时触发 DOM 更新、销毁实例等。在这个过程中会运行一些叫做生命周期钩子的函数&#xff0c;通过这些钩子函数可以定义业务逻…...

遥感之常用各种指数总结大全

目前在遥感领域基本各种研究领域都会用到各种各样的指数&#xff0c;如水体指数&#xff0c;植被指数&#xff0c;农业长势指数&#xff0c;盐分指数&#xff0c;云指数&#xff0c;阴影指数&#xff0c;建筑物指数&#xff0c;水质指数&#xff0c;干旱指数等等众多。 本文对上…...

【C++】C++11新增特性

目录 C11简介&#xff1a; 1、统一的列表初始化&#xff1a; std::initializer_list 2、自动类型推导&#xff1a; auto&#xff1a; decltype&#xff1a; 3、final 和 override final&#xff1a; override&#xff1a; 4、默认成员函数控制&#xff1a; 显示缺省…...

【LeetCode每日一题】——662.二叉树最大宽度

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 广度优先搜索 二【题目难度】 中等 三【题目编号】 662.二叉树最大宽度 四【题目描述】 给…...

第二十三节、血量更新逻辑的实现

一、创建代码 引入命名空间 using UnityEngine.UI; 调用UI必须有这个代码 二、ScriptObject类 1、是一个持久化存储文件的类型 接收所有的事件方法 先继承SO类&#xff0c;然后创建项目菜单 2、进行订阅 放入事件类&#xff0c;关联代码&#xff0c;即可进行广播 传递给这…...

Spring Authorization Server 认证服务器搭建

Spring Authorization Server实现了oauth2和oidc,最近有了解相关技术的需求,所以就尝试着进行了基本的环境搭建和技术测试,目前只测试了授权码模式,做一个记录,后续需要用时方便查找和参考。 1. 版本要求 Spring Authorization Server 版本:1.3.1 JDK 版本:17 Spring B…...

秋招突击——8/15——知识补充——垃圾回收机制

文章目录 引言正文指针引用可达性分析算法垃圾回收算法标记清除算法标记整理算法复制分代收集 垃圾收集器Serial收集器ParNew并行收集器Parallel Scavenge吞吐量优先收集器Serial Old老年代收集器Parallel old收集器CMS收集器G1收集器&#xff08;Garbage First垃圾优先&#x…...

【iOS】UITableViewCell的重用问题解决方法

我自己在实验中对cell的重用总结如下&#xff1a; 非自定义Cell和非自定义cell的复用情况一样&#xff1a; 第一次加载创建tableView的时候&#xff0c;是屏幕上最多也显示几行cell就先创建几个cell&#xff0c;此时复用池里什么都没有开始下滑tableView&#xff0c;刚开始滑…...

开发一个微信小程序商城需要哪些技术栈

开发一个小程序商城需要掌握以下技术栈&#xff1a;‌ 前端技术&#xff1a;‌包括HTML、‌CSS和JavaScript&#xff0c;‌用于定义商城的页面结构、‌样式设计和交互功能。‌ 微信小程序专用技术&#xff1a;‌如WXML、‌WXSS、‌JavaScript和JSON&#xff0c;‌用于描述小程…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

起重机起升机构的安全装置有哪些?

起重机起升机构的安全装置是保障吊装作业安全的关键部件&#xff0c;主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理&#xff1a; 一、超载保护装置&#xff08;核心安全装置&#xff09; 1. 起重量限制器 功能&#xff1a;实时监测起升载荷&a…...