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

颈源性耳鸣,别当成耳部疾病治

耳朵里嗡嗡响、耳鸣不止&#xff0c;听力不受影响&#xff0c;去耳鼻喉科检查却查不出问题&#xff0c;吃药、调理也没有效果&#xff0c;这种耳鸣很可能不是耳部本身的问题&#xff0c;而是颈椎病变引发的颈源性耳鸣&#xff0c;也是极易被误诊的颈椎并发症。颈椎两侧分布着椎…...

TripoSR:0.5秒从单图到3D模型,开源3D重建的革命性工具

TripoSR&#xff1a;0.5秒从单图到3D模型&#xff0c;开源3D重建的革命性工具 【免费下载链接】TripoSR 项目地址: https://gitcode.com/GitHub_Trending/tr/TripoSR TripoSR是一款由Tripo AI与Stability AI联合开发的开源单图像3D重建模型&#xff0c;能够在短短0.5秒…...

GLM-OCR与IDEA开发环境联动:打造智能代码注释与文档生成插件

GLM-OCR与IDEA开发环境联动&#xff1a;打造智能代码注释与文档生成插件 想象一下这个场景&#xff1a;你正在一个技术分享会上&#xff0c;看到屏幕上闪过一段精妙的代码片段&#xff0c;你赶紧用手机拍了下来。回到工位&#xff0c;你不再需要对着照片一个字一个字地敲键盘&…...

LVGL下拉列表控件lv_dropdown实战:从基础配置到高级定制(附完整代码示例)

LVGL下拉列表控件lv_dropdown实战&#xff1a;从基础配置到高级定制&#xff08;附完整代码示例&#xff09; 在嵌入式UI开发领域&#xff0c;LVGL&#xff08;Light and Versatile Graphics Library&#xff09;凭借其轻量级和高度可定制的特性&#xff0c;已成为许多开发者的…...

5步实现黑苹果零门槛配置:智能工具的降维打击方案

5步实现黑苹果零门槛配置&#xff1a;智能工具的降维打击方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 当你第三次因为ACPI补丁错误导致系统崩溃…...

volatile、内存屏障与 CPU 缓存机制详解

一、前置认知&#xff1a;CPU 缓存模型——并发可见性问题的根源 要理解 volatile&#xff0c;首先要搞懂 CPU 缓存模型。在计算机系统中&#xff0c;CPU 的运算速度远高于内存的读写速度&#xff0c;为了弥补两者之间的性能差距&#xff0c;CPU 厂商在 CPU 和内存之间引入了缓…...

解决Windows远程桌面连接Ubuntu时xrdp闪退的配置技巧

1. 问题现象与排查思路 最近在帮同事配置Windows远程连接Ubuntu时遇到了一个典型问题&#xff1a;用Windows自带的远程桌面连接工具输入账号密码后&#xff0c;界面闪退无法进入桌面。这种情况在Ubuntu 18.04/20.04/22.04各版本中都可能出现&#xff0c;特别是使用GNOME桌面环…...

别再为Allegro导图发愁了!手把手教你用RATA工具搞定BMP单色图转换(附像素调整避坑指南)

Allegro图片导入难题终极指南&#xff1a;从原理到实战的完整解决方案 在PCB设计领域&#xff0c;Allegro作为行业标杆工具&#xff0c;却有一个让无数工程师头疼的"阿喀琉斯之踵"——图片导入功能。无论是公司Logo、结构示意图还是特殊标识&#xff0c;当我们需要将…...

从零构建:基于C语言的Modbus RTU从站驱动开发指南

1. Modbus RTU从站驱动开发入门指南 第一次接触Modbus RTU从站开发时&#xff0c;我完全被各种专业术语搞晕了。后来在工厂里调试一个温湿度传感器时&#xff0c;才真正理解这个协议的精妙之处——它就像车间里老师傅们约定俗成的对话方式&#xff0c;主设备问一句&#xff0c;…...

DexGraspNet与多指手抓取算法详解:从理论到工程实现

目录 DexGraspNet与多指手抓取算法详解:从理论到工程实现 第一部分:原理详解 第一章 绪论与灵巧抓取的挑战 1.1 机器人抓取技术演进 1.1.1 从平行夹爪到多指灵巧手 1.1.2 灵巧抓取的独特挑战 1.2 DexGraspNet的研究背景与意义 1.2.1 大规模数据驱动的必要性 1.2.2 D…...