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()可以让我们连接系统提供的信号和槽,同时也可以自定义信号槽。 例如以学生和老师构建类同时当老师触发信号下课同学收到信号执行“吃饭”这一动作代码示例 #include "SignalAndSlot.h" //Teacher Student 总框架…...
one-shot 序列图像红外小目标分割
one-shot 序列图像红外小目标分割 IEEE TRANSACTIONS ON GEOSCIENCE AND REMOTE SENSING 代码还未开源 GitHub - D-IceIce/one-shot-IRSTS few-shot:利用少量标注样本进行学习 one-shot: 属于few-shot的特殊情况,只用一个样本进行学习 zero-shot&am…...
JavaScript 单线程防阻塞的原理
JavaScript 是一种单线程语言,这意味着它一次只能执行一个任务。这种设计可能会导致一些问题,比如当遇到耗时的操作时,整个程序可能会被阻塞。为了解决这个问题,JavaScript 使用了事件循环和回调函数的机制,实现了非阻塞式的异步操作。 事件循环 JavaScript 有一个事件队列,用…...
Shell脚本发送邮件的详细步骤与配置方法?
Shell脚本发送邮件的进阶技巧?怎么配置Shell脚本发信? 使用Shell脚本发送邮件是一种高效的自动化手段,特别是在需要定期发送报告、通知或警告信息时。AokSend将详细介绍Shell脚本发送邮件的步骤与配置方法,帮助您更好地掌握这一技…...
如何把Phalcon 集成到PhpStorm里面
一 背景 按照上一篇文章里面写的Phalcon 创建项目过程中的一些坑, 最终我们在终端可以基于Phalcon命令创建对应的开发项目。但在这个过程中,存在一个问题:那就是写代码的时候,发现Phalcon对应的依赖提示都没有,如下: 从上面这个截图来看,就能发现,Phalcon的啥…...
python从入门到精通:循环语句
目录 前言 1、while循环的基础语法 2、while循环的嵌套 3、for循环的基础语法 range语句: for循环临时变量作用域: 4、for循环的嵌套 5、循环中断:break和continue 前言 循环普遍存在于日常生活中,同样,在程序中…...
Codeforces Round 965 (Div. 2)
前言 有人在过七夕,我在打 cf ,还有某人独自一人在学校机房,凌晨一点骑上共享单车回宿舍欣赏沿途的秋风扫落叶。 Standings:2166 题目链接:Dashboard - Codeforces Round 965 (Div. 2) - Codeforces A. Find K Distin…...
Win10下载安装Mysql服务
Win10下载安装MySQL 一、官网下载MySQL 1.官网地址: https://www.mysql.com/ 2.在官网首页拉到最下方,点击MySQL Community Server: 3.根据个人电脑的操作系统选择,此处以Windows x64为例,选择第2个,点击…...
MVVM(Model-View-ViewModel)架构模式
在Android开发中,MVVM(Model-View-ViewModel)架构模式已经成为构建可维护和可扩展应用程序的重要选择。MVVM模式通过分离视图(View)、模型(Model)和视图模型(ViewModel)来…...
C#MVC返回DataTable到前端展示。
很久没写博客了,闭关太久,失踪人口回归,给诸位道友整点绝活。 交代下背景:要做一个行转列的汇总统计,而且,由于是行转列,列的数量不固定,所以,没法使用正常的SqlSugar框…...
HttpUtils工具类(二)Apache HttpClient 5 使用详细教程
目录 一、Apache HttpClient 5介绍 (1)核心特性 (2)Apache HttpClient 5 的新特性 (3)在 Java 项目的主要使用场景及缺点 使用场景: 缺点: 二、在实际项目中的应用 …...
Vue3.0生命周期钩子(包含:Vue 2.0 和 Vue 3.0)
1、Vue 2.0 生命周期钩子 每个应用程序实例在创建时都有一系列的初始化步骤。例如,创建数据绑定、编译模板、将实例挂载到 DOM 并在数据变化时触发 DOM 更新、销毁实例等。在这个过程中会运行一些叫做生命周期钩子的函数,通过这些钩子函数可以定义业务逻…...
遥感之常用各种指数总结大全
目前在遥感领域基本各种研究领域都会用到各种各样的指数,如水体指数,植被指数,农业长势指数,盐分指数,云指数,阴影指数,建筑物指数,水质指数,干旱指数等等众多。 本文对上…...
【C++】C++11新增特性
目录 C11简介: 1、统一的列表初始化: std::initializer_list 2、自动类型推导: auto: decltype: 3、final 和 override final: override: 4、默认成员函数控制: 显示缺省…...
【LeetCode每日一题】——662.二叉树最大宽度
文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 广度优先搜索 二【题目难度】 中等 三【题目编号】 662.二叉树最大宽度 四【题目描述】 给…...
第二十三节、血量更新逻辑的实现
一、创建代码 引入命名空间 using UnityEngine.UI; 调用UI必须有这个代码 二、ScriptObject类 1、是一个持久化存储文件的类型 接收所有的事件方法 先继承SO类,然后创建项目菜单 2、进行订阅 放入事件类,关联代码,即可进行广播 传递给这…...
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收集器(Garbage First垃圾优先&#x…...
【iOS】UITableViewCell的重用问题解决方法
我自己在实验中对cell的重用总结如下: 非自定义Cell和非自定义cell的复用情况一样: 第一次加载创建tableView的时候,是屏幕上最多也显示几行cell就先创建几个cell,此时复用池里什么都没有开始下滑tableView,刚开始滑…...
开发一个微信小程序商城需要哪些技术栈
开发一个小程序商城需要掌握以下技术栈: 前端技术:包括HTML、CSS和JavaScript,用于定义商城的页面结构、样式设计和交互功能。 微信小程序专用技术:如WXML、WXSS、JavaScript和JSON,用于描述小程…...
OpenClaw 生态全景图——AI 助理如何改变工作方式
OpenClaw 生态全景图——AI 助理如何改变工作方式摘要:2026 年,AI 助理从"玩具"变成"工具"。本文带你了解 OpenClaw 生态系统的完整布局,看它如何连接微信、飞书、钉钉等主流平台,以及企业和个人如何利用它提…...
QAnything混合检索实战:ElasticSearch与向量搜索的协同优化
QAnything混合检索实战:ElasticSearch与向量搜索的协同优化 1. 为什么电商搜索总在“猜”用户心思? 你有没有遇到过这样的情况:在电商平台搜索“轻便透气运动鞋”,结果首页全是厚重的登山靴?或者搜“适合夏天穿的连衣…...
OpenTelemetry Operator快速入门:5分钟搞定K8s集群中的分布式追踪系统搭建
OpenTelemetry Operator快速入门:5分钟搞定K8s集群中的分布式追踪系统搭建 在云原生时代,微服务架构的复杂性让分布式追踪成为刚需。想象一下,当某个电商平台的订单服务出现延迟,你需要快速定位是支付网关、库存系统还是物流接口的…...
终极Bash Infinity代码审查指南:确保Bash框架代码质量的完整检查清单
终极Bash Infinity代码审查指南:确保Bash框架代码质量的完整检查清单 【免费下载链接】bash-oo-framework Bash Infinity is a modern standard library / framework / boilerplate for Bash 项目地址: https://gitcode.com/gh_mirrors/ba/bash-oo-framework …...
MozJPEG色彩空间扩展终极指南:支持RGBX、BGRX等32位格式的完整教程
MozJPEG色彩空间扩展终极指南:支持RGBX、BGRX等32位格式的完整教程 【免费下载链接】mozjpeg Improved JPEG encoder. 项目地址: https://gitcode.com/gh_mirrors/mo/mozjpeg MozJPEG作为libjpeg-turbo的增强版本,不仅提供了卓越的JPEG压缩性能&a…...
如何实现Chaos Mesh全链路国际化:从文档到UI的完整指南
如何实现Chaos Mesh全链路国际化:从文档到UI的完整指南 【免费下载链接】chaos-mesh Chaos Mesh 是一个云原生混沌工程平台,用于测试、故障注入和混沌工程。 * 用于混沌工程、故障注入和流量管理、支持 Prometheus 和 Grafana。 * 有什么特点:…...
VeraCrypt加密卷功能解析与个性化配置指南
VeraCrypt加密卷功能解析与个性化配置指南 【免费下载链接】VeraCrypt Disk encryption with strong security based on TrueCrypt 项目地址: https://gitcode.com/GitHub_Trending/ve/VeraCrypt VeraCrypt作为一款基于TrueCrypt的开源磁盘加密工具,提供了强…...
收藏 | 阿里字节开源Agent框架大比拼:小白程序员必看,三种思路助你入门大模型!
本文对比了阿里和字节开源的HiClaw、CoPaw和DeerFlow三个Agent框架,分析了它们在架构设计、安全模型和适用场景上的差异。HiClaw侧重多Agent协作,CoPaw聚焦个人AI助手,DeerFlow强调单Agent深度任务处理。文章还探讨了阿里组合拳与字节单点突破…...
告别OpenAI依赖:用智谱AI与轻量本地模型构建RAG评估实战
1. 为什么需要替代OpenAI的RAG评估方案 当我们在构建RAG(检索增强生成)系统时,评估环节至关重要。传统的Ragas框架默认使用OpenAI的GPT模型进行评估,但这会带来几个实际问题: 首先是访问稳定性问题。由于网络环境差异…...
革新性植物大战僵尸全能修改工具:重定义游戏体验
革新性植物大战僵尸全能修改工具:重定义游戏体验 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 植物大战僵尸辅助工具PVZ Toolkit是一款专为经典游戏《植物大战僵尸》PC版设计的开源修…...
