当前位置: 首页 > 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;‌用于描述小程…...

CANOE-介绍 @009软件Trace窗口过滤栏空白【Trace窗口筛选框失效】

一、现象&#xff1a; 二、原因&#xff1a; 初步结论是&#xff0c;Windos插件自动更新导致&#xff0c;有系统更新&#xff0c;导致兼容性问题。例如&#xff0c;有用户报告在更新Windows后&#xff0c;Trace窗口筛选栏变空白&#xff0c;解决方法是卸载特定的更新包并重启电…...

LiuJuan20260223Zimage入门必看:LoRA权重文件结构解析与自定义替换方法

LiuJuan20260223Zimage入门必看&#xff1a;LoRA权重文件结构解析与自定义替换方法 你是不是刚接触LiuJuan20260223Zimage这个文生图模型&#xff0c;看着生成的图片效果不错&#xff0c;但心里总有个疑问&#xff1a;这个模型是怎么做到生成特定风格图片的&#xff1f;它背后…...

SAP 成本分摊逻辑与案例(含具体数据)

SAP 成本分摊核心是通过 ** 分配&#xff08;Allocation&#xff09;与分摊&#xff08;Assessment&#xff09;** 两种循环&#xff0c;将间接成本中心归集的费用&#xff0c;按预设规则&#xff08;统计指标、比例、作业量等&#xff09;结转至直接成本中心、生产订单、内部订…...

圣女司幼幽-造相Z-Turbo保姆级教程:cat日志定位问题+Gradio端口映射调试

圣女司幼幽-造相Z-Turbo保姆级教程&#xff1a;cat日志定位问题Gradio端口映射调试 1. 快速了解圣女司幼幽-造相Z-Turbo 圣女司幼幽-造相Z-Turbo是一个专门生成《牧神记》中圣女司幼幽角色图片的AI模型。这个模型基于Z-Image-Turbo的LoRA版本训练而成&#xff0c;能够根据文字…...

银河麒麟V10 SP1离线环境搭建全攻略:从Java8到Node.js的避坑指南

银河麒麟V10 SP1离线环境搭建全攻略&#xff1a;从Java8到Node.js的避坑指南 在国产操作系统日益普及的今天&#xff0c;银河麒麟V10 SP1作为一款安全可靠的操作系统&#xff0c;正被越来越多的企业和开发者采用。然而&#xff0c;在离线环境下搭建完整的开发环境&#xff0c;尤…...

用Python复刻经典:植物大战僵尸游戏中的面向对象编程实践

Python面向对象编程实战&#xff1a;从植物大战僵尸源码看游戏开发精髓 当经典塔防游戏遇上Python的面向对象编程&#xff0c;会碰撞出怎样的火花&#xff1f;本文将带你深入分析一个Python复刻版植物大战僵尸的源码设计&#xff0c;通过游戏开发中的实际案例&#xff0c;揭示面…...

Windows Cleaner终极指南:3分钟解决C盘爆红,让你的电脑重获新生!

Windows Cleaner终极指南&#xff1a;3分钟解决C盘爆红&#xff0c;让你的电脑重获新生&#xff01; 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是不是也经…...

GIS小白必看:5种全球人口数据下载指南(含百度云链接)

GIS初学者必备&#xff1a;5大全球人口数据集深度解析与高效获取指南 刚接触地理信息系统的朋友&#xff0c;常常会在第一步——数据获取上就遇到难题。面对五花八门的人口数据集&#xff0c;分辨率、年份、坐标系统这些专业术语让人眼花缭乱&#xff0c;更别提有些国际数据平…...

使用MiniCPM-V-2_6进行Git仓库智能分析:代码质量评估

使用MiniCPM-V-2_6进行Git仓库智能分析&#xff1a;代码质量评估 1. 引言 你有没有遇到过这样的情况&#xff1a;接手一个新项目&#xff0c;面对成千上万行代码&#xff0c;不知道从哪里开始看起&#xff1f;或者团队代码风格混乱&#xff0c;每次代码审查都像在玩"大家…...

实战指南:如何用GNN识别以太坊DApp流量(附完整数据集处理流程)

实战指南&#xff1a;如何用GNN识别以太坊DApp流量&#xff08;附完整数据集处理流程&#xff09; 在区块链技术快速发展的今天&#xff0c;以太坊上的去中心化应用(DApp)数量呈指数级增长。这些应用产生的加密流量不仅承载着用户与智能合约的交互信息&#xff0c;也隐藏着丰富…...