三、自定义信号和槽函数(无参和有参)

news/2024/7/25 21:08:20/文章来源:https://blog.csdn.net/qq_41264055/article/details/139070570

需求:
下班后,小明说请小红吃好吃的,随便吃,吃啥买啥
无参:小红没有提出吃啥
有参:小红提出自己想吃的东西,吃啥取决于一时兴起(emit触发)

思路:
1,定义一个button和一个label,button点击表示下班
2,定义两个类,小明和小红类,小红类里面为signals信号,小明类里面为slots槽函数
3,小红类和小明类均包括有参和无参两种情况,因为小红有可能没有自己的想法,也有可能有自己的主意

一、项目创建

在这里插入图片描述
项目名称:Afterwork
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
新建xiaomingxiaohong两个QtWidgetsClass
在这里插入图片描述
在这里插入图片描述
直接下一步就行

最终的目录结构
在这里插入图片描述

二、UI布局

两个button,一个label
第一个button负责触发下班信号(无参),因为小红没有想法
第二个button负责触发下班信号(有参),小红有想法,想吃啥取决于emit触发这个信号是有参的还是无参数的
label负责显示一下信息,emit在Afterwork.h中定义,在Afterwork.cpp中实现
在这里插入图片描述

三、signals信号函数

xiaohong为信号方,故需要进行定义相应的signals信号,需要告诉xiaoming,自己想吃啥
有两种情况:
一种是无参,不知道想吃啥,没主意
另一种是有参,有想法,但需要看emit给这个信号发送的参数food
emit在Afterwork.h中定义,在Afterwork.cpp中实现

1,xiaohong.h

对信号函数进行声明,信号只声明不实现

#include "ui_xiaohong.h"class xiaohong : public QMainWindow
{Q_OBJECTpublic:xiaohong(QWidget *parent = nullptr);~xiaohong();signals:void eat();void eat(QString food);private:Ui::xiaohongClass ui;
};

2,xiaohong.cpp

不需要改变

#include "xiaohong.h"
#include <QDebug>xiaohong::xiaohong(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);
}xiaohong::~xiaohong()
{}

四、slots槽函数

1,xiaoming.h

xiaoming为信号接收方,有两种信号,有可能有想法(取决于emit触发xiaohong的信号所携带的参数food),也有可能没有想法,此时需要对应两个槽函数进行接收。槽函数既要声明也要实现
因为这是头文件,这里只需要声明,实现的话在.cpp文件中进行实现

#pragma once#include <QMainWindow>
#include "ui_xiaoming.h"class xiaoming : public QMainWindow
{Q_OBJECTpublic:xiaoming(QWidget *parent = nullptr);~xiaoming();public slots:void buy();void buy(QString foodName);private:Ui::xiaomingClass ui;
};

2,xiaoming.cpp

若xiaohong没想法,调用无参的buy函数,输出She doesn’t know what to eat, and I don’t know what to buy.
若xiaohong有想法,就调用有参的buy函数,形参为QString food,输出qDebug() << “Buy her a " << food.toUtf8().data()<<”.";

Qt里面输出用的是qDebug(),因为在Qt在输出变量的时候会有双引号,需要将其去掉,通过toUtf8().data()

#include "xiaoming.h"
#include <QDebug>xiaoming::xiaoming(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);
}xiaoming::~xiaoming()
{}//实现
void xiaoming::buy()
{qDebug() << "She doesn't know what to eat, and I don't know what to buy.";
}void xiaoming::buy(QString food)
{//QString 自带双引号//先转QByteArray(使用toUtf8())再转char*(使用data())qDebug() << "Buy her a " << food.toUtf8().data()<<".";
}

五、Afterwork.h

xiaoming* xm;xiaohong* xh;
之所以在Afterwork类里面定义xiaoming和xiaohong类的对象xmxh,是因为这里面的两个用于emit触发xiaohong的信号的函数workoff_n和workoff_y)是private类的,emit触发信号的时候需要对类对象进行发送,故在Afterwork类里面进行了定义xiaoming和xiaohong类的对象xmxh

void workoff_n(); 用于emit触发信号(无参数),触发xiaohong,给xiaohong说下班了,此时的xiaohong没想法吃啥
void workoff_y();用于emit信号(有参数food),激发xiaohong,给xiaohong说下班了,此时的xiaohong想吃food,这里的food是形参,可以自定义

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_Afterwork.h"
#include "xiaoming.h"
#include "xiaohong.h"class Afterwork : public QMainWindow
{Q_OBJECTpublic:Afterwork(QWidget *parent = nullptr);~Afterwork();private:Ui::AfterworkClass ui;xiaoming* xm;xiaohong* xh;void workoff_n();void workoff_y();
};

六、Afterwork.cpp

无参和有参的emit触发信号函数的实现

无参emit触发信号函数workoff_n() ,信号发出者xiaohong,emit触发xiaohong的不知道想吃啥的信号
ui上的label控件显示She doesn’t know what to eat.
有参(hamburger)emit触发信号函数workoff_y() ,信号发出者xiaohong,emit触发xiaohong的想吃hamburger的信号,这里的hamburger是字符串,可以进行自定义
ui上的label控件显示She wants a hamburger.

void Afterwork::workoff_n() 
{emit xh->eat();ui.label->setText("She doesn't know what to eat.");
}
void Afterwork::workoff_y()
{emit xh->eat("hamburger");ui.label->setText("She wants a hamburger.");
}

1,无参
void(xiaoming:: * xmSignal_n)(void) = &xiaoming::buy;
void(xiaohong:: * xhSignal_n)(void) = &xiaohong::eat;
&为地址,指针可以指向地址,函数指针可以指向函数地址
(void) 这里是无参,对应的是无参的 &xiaoming::buy 和无参的 &xiaohong::eat

关联
connect(xh, xhSignal_n, xm, xmSignal_n);
信号发出者为:xiaohong类对象xh
发送的信号为:xhSignal_n,xiaohong的没有想法的eat,即无参信号
信号接收者为:xiaoming类对象xm
信号的处理(槽函数):xmSignal_n,xiaoming面对xiaohong无想法(无参)的eat信号所采用的无想法(无参)的buy槽函数相应

再次关联
connect(ui.pushButton, &QPushButton::clicked, this, &Afterwork::workoff_n);
信号发出者为:ui.pushButton,也就是下班(没想法)这个按键
发送的信号为:&QPushButton::clicked,按键被点击
信号接收者为:this当前这个QWidget
信号的处理(槽函数):&Afterwork::workoff_n,用于emit触发函数对xiaohong这个信号进行触发,触发的时候无参数传递

2,有参
void(xiaohong:: * xhSignal_y)(QString) = &xiaohong::eat;
void(xiaoming:: * xmSignal_y)(QString) = &xiaoming::buy;
&为地址,指针可以指向地址,函数指针可以指向函数地址
(QString) 这里是有参,且参数是QString类型,对应的是有参且参数类型为QString&xiaoming::buy有参且参数类型为QString&xiaohong::eat

关联
connect(xh, xhSignal_y, xm, xmSignal_y);
信号发出者为:xiaohong类对象xh
发送的信号为:xhSignal_y,xiaohong的有想法(有food形参)的eat
信号接收者为:xiaoming类对象xm
信号的处理(槽函数):xmSignal_y,xiaoming面对xiaohong有想法(有参,但取决于emit触发传入的food形参)的eat信号所采用的有想法的buy槽函数相应

再次关联
connect(ui.pushButton_2, &QPushButton::clicked, this, &Afterwork::workoff_y);
信号发出者为:ui.pushButton_2,也就是下班(有想法)这个按键
发送的信号为:&QPushButton::clicked,按键被点击
信号接收者为:this当前这个QWidget
信号的处理(槽函数):&Afterwork::workoff_y,用于emit触发函数对xiaohong这个信号进行触发,触发的时候带有food参数

#include "Afterwork.h"
#include <QDebug>
#include "xiaohong.h"
#include "xiaoming.h"Afterwork::Afterwork(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);this->xh = new xiaohong(this);this->xm = new xiaoming(this);//无参数void(xiaoming:: * xmSignal_n)(void) = &xiaoming::buy;void(xiaohong:: * xhSignal_n)(void) = &xiaohong::eat;connect(xh, xhSignal_n, xm, xmSignal_n);connect(ui.pushButton, &QPushButton::clicked, this, &Afterwork::workoff_n);//有参数void(xiaohong:: * xhSignal_y)(QString) = &xiaohong::eat;void(xiaoming:: * xmSignal_y)(QString) = &xiaoming::buy;connect(xh, xhSignal_y, xm, xmSignal_y);connect(ui.pushButton_2, &QPushButton::clicked, this, &Afterwork::workoff_y);
}Afterwork::~Afterwork()
{}//触发信号
void Afterwork::workoff_n() 
{emit xh->eat();ui.label->setText("She doesn't know what to eat.");
}
void Afterwork::workoff_y()
{emit xh->eat("hamburger");ui.label->setText("She wants a hamburger.");
}

七、运行效果

启动
在这里插入图片描述
点击,下班(没想法),无参
在这里插入图片描述
点击,下班(有想法),这里emit触发的时候传入的是hamburger,有参
在这里插入图片描述

八、总结

在这里插入图片描述
首先,xiaohong是负责发送信号的,有eat()和eat(QString food)两个发送信号方法,无参和有参
xiaoming是负责相应信号的,有buy()和buy(QString foodName)两个槽函数,用于相应xiaohong发过来的不同信号进行不同相应

无参绑定
void(xiaoming:: * xmSignal_n)(void) = &xiaoming::buy;
void(xiaohong:: * xhSignal_n)(void) = &xiaohong::eat;
connect(xh, xhSignal_n, xm, xmSignal_n);
connect(ui.pushButton, &QPushButton::clicked, this, &Afterwork::workoff_n);
将xiaohong的无参信号eat()和xiaoming的无参槽函数相应buy()进行绑定连接
将第一个button以及被点击信号和触发函数Afterwork::workoff_n()进行绑定用于触发xiaohong的eat()信号
因为之前connect(xh, xhSignal_n, xm, xmSignal_n);已经将xiaohong和xiaoming进行了绑定,故xiaohong发出eat()信号,xiaoming进行槽函数buy()相应

有参绑定
void(xiaohong:: * xhSignal_y)(QString) = &xiaohong::eat;
void(xiaoming:: * xmSignal_y)(QString) = &xiaoming::buy;
connect(xh, xhSignal_y, xm, xmSignal_y);
connect(ui.pushButton_2, &QPushButton::clicked, this, &Afterwork::workoff_y);
将xiaohong的有参信号eat(QString food)和xiaoming的有参槽函数相应buy(QString foodName)进行绑定连接
将第二个button以及被点击信号和触发函数Afterwork::workoff_y进行绑定用于触发xiaohong的eat(QString food)信号
因为之前connect(xh, xhSignal_y, xm, xmSignal_y);已经将xiaohong和xiaoming进行了绑定,故xiaohong发出eat(QString food)信号,xiaoming进行槽函数buy(QString foodName)相应

项目运行,启动Afterwork.ui页面,当用户点击不同的button从而进行不同的相应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1053120.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

钉钉企业内部H5微应用或小程序之钉消息推送

钉钉简单的推送钉消息 一、钉钉准备工作 首先进入钉钉开放平台 你得有企业内部微应用或者小程序 没有创建的话去看我另一篇文章有说明 钉钉开放平台创建企业内部H5微应用或者小程序-CSDN博客 看不懂话也可以参考官方文档&#xff1a;创建应用 - 钉钉开放平台 二、开发的准备…

微服务项目收获和总结---第5天(定时发布)

延迟任务 目录 延迟任务技术对比&#xff1a; Redis实现定时任务&#xff1a;​编辑新增任务&#xff1a;取消任务&#xff1a;拉取任务&#xff1a;Zset定时刷新数据到List中&#xff1a;分布式锁实现定时任务只刷新一次&#xff1a; 技术对比&#xff1a; Redis实现定时任…

软考数据库系统工程师试题及答案,分享几个实用搜题和学习工具 #媒体#知识分享#知识分享

以下分享的软件提供了各种实用的功能&#xff0c;如数学公式计算、语文阅读辅助等&#xff0c;让大学生们在学习过程中更加高效和便利。 1.众课帮 这是搜题app 一款考试找答案工具 &#xff0c;支持拍照、语音、文字三种搜题方式。拥有海量题库&#xff0c;覆盖了大学生网课…

二零二四充能必读 | 618火热来袭,编程书单助你提升代码力

文章目录 &#x1f4d8; Java领域的经典之作&#x1f40d; Python学习者的宝典&#x1f310; 前端开发者的权威指南&#x1f512; 并发编程的艺术&#x1f916; JVM的深入理解&#x1f3d7; 构建自己的编程语言&#x1f9e0; 编程智慧的结晶&#x1f31f; 代码效率的提升 亲爱的…

Spring系列-02-Bean类型, 作用域, 实例化, 生命周期

Bean类型, 作用域, 实例化, 生命周期 Bean类型 在 SpringFramework 中,对于 Bean 的类型,一般有两种设计: 普通BeanFactoryBean 普通Bean 三种方式 Component注解配置类Beanxml <bean> Component public class Child {}Bean public Child child() {return new Ch…

mars3d实现geojson文件xxx.json格式等实现贴地效果

说明&#xff1a; 1.mars3d.js我们的这个sdk内部参数clampToGround是异步计算贴地效果的&#xff0c;最好的贴地方式是&#xff0c;给json数据准确的带高度的经纬度值。 补充前置知识说明&#xff0c;本身的geojson数据格式每个字段代表的意思需要掌握&#xff0c; GeoJSON …

Java super关键字

super代表父类的引用&#xff0c;用于访问父类的属性、方法和构造器。 1、super的访问不限于直接父类&#xff1a; 若爷爷类和本类有同名的成员&#xff0c;也可以使用super去访问。 若多个上级类都有同名成员&#xff0c;使用super则遵循就近原则。 2、super和this比较&…

弘君资本炒股技巧:股票定向增发是什么意思?是好是坏?

股票定向增发是指已上市的公司向指定的组织或者个人投资者额外发行股份募集资金的融资方法&#xff0c;发行价格为发行前某一阶段的平均价的必定比例&#xff0c;增发的价格不得低于前二十个买卖日股票均价的80&#xff05;。 例如&#xff0c;个股定增前二十个买卖股票平均价为…

Generate Anything Anywhere in Any Scene #论文阅读

URL https://arxiv.org/pdf/2306.17154 TD;DR 2023 年 6 月 Wisconsin 的文章。围绕 ip 保持做的扩展任务&#xff0c;核心目标是对指定 ip 可以生成任意大小的&#xff08;指定 ip&#xff09;、任意背景的图片&#xff0c;同时可以通过 bbox 控制物体位置和多物体生成。主…

外卖系统源码解读:校园外卖APP开发全攻略

外卖系统源码解读&#xff1a;校园外卖APP开发全攻略 今天&#xff0c;小编将深入解读外卖系统的源码&#xff0c;详细介绍如何开发一款功能齐全的校园外卖APP&#xff0c;帮助开发者快速上手&#xff0c;打造出高质量的外卖应用。 一、需求分析 应具备以下基本功能&#xff…

vue中的$nextTick和过渡与动画

一.vue中的$nextTick 简述与用法&#xff1a;这是一个生命周期钩子 1.语法&#xff1a;this.$nextTick(回调函数) 2.作用&#xff1a;在下一次DOM更新结束后执行其指定的回调 3.什么时候用&#xff1a;当修改数据后&#xff0c;要基于更新后的新dom进行某些操作时&#xff0c;…

学习笔记之——2D Gaussian Splatting(2DGS)

3DGS在辐射场重建中取得了巨大的成就&#xff0c;实现高质量的新视图合成和快速渲染。最近新出了3DGS的升级版本&#xff0c;2DGS。写下本博文记录本人学习及测试2DGS的过程&#xff0c;本博文仅为本人学习记录用~ Project WebsiteGithub CodeOriginal paper 原理解读 由于3D…

汽车短视频怎么拍?成都科成博通文化传媒公司

汽车短视频怎么拍&#xff1f; 随着短视频平台的兴起&#xff0c;汽车爱好者们纷纷将自己的汽车生活、驾驶体验以及车辆评测等内容以短视频的形式呈现给大众。汽车短视频不仅满足了观众对汽车文化的好奇心&#xff0c;也为汽车品牌和汽车相关行业提供了宣传和推广的新渠道。那…

【机器学习】机器学习基础概念与初步探索

❀机器学习 &#x1f4d2;1. 引言&#x1f4d2;2. 机器学习概述&#x1f4d2;3. 机器学习基础概念&#x1f389;2.1 机器学习的分类&#x1f389;2.2 数据预处理&#x1f308;数据清洗与整合&#x1f308; 特征选择和特征工程&#x1f308;数据标准化与归一化 &#x1f4d2;4. …

Mesa Gallium框架入门初探

Mesa Gallium框架入门初探 MESA Gallium框架 MESA源码里面有2套架构&#xff0c;现在驱动主要基于Gallium架构。 这里我们重点来看看Gallium架构: 经典架构 Gallium架构 Gallium展开 Gallium中主要包含下面几块&#xff1a; Auxiliary模块&#xff1a;一些公共函数或者辅助…

菜鸟的JavaSE学习之旅5

这是一个目录 面向对象类和对象类对象类的定义一个对象的内存成员变量和局部变量定义位置不同作用范围不同默认值不同内存位置不同生命周期不同 关键字this关键字 构造方法标准的类 面向对象 当需要实现一个功能的时候&#xff0c;不关心具体的步骤&#xff0c;而是找一个具有…

Python考试复习--day4

1.三角函数计算 import math aeval(input()) beval(input()) x(-bpow(2*a*math.sin(math.pi/3)*math.cos(math.pi/3),0.5))/(2*a) print(x) math库 2.分段函数B import math xeval(input()) if -6<x<0:yabs(x)5 elif 0<x<3:ymath.factorial(x) elif 3<x<6:y…

JMM 理解

JMM&#xff1a; Java Memory Model (JAVA内存模型) 【JMM】 允许编译器和缓存以数据在处理器特定的缓存(或寄存器)和主存之间的移动次序拥有重要的特权。 非程序员使用了volatitle 或 synchronized明确请求了某些可见性的保证。 从几个方面学习 1、什么是JMM&#xff1f; 答…

素数判断的奥秘与编程实践

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、素数定义的深入理解 二、非素数的例子与思考 三、素数判断的编程实现 1. 穷举法判断素…

什么是知识中台?为什么企业需要知识中台?

如今市面上的企业数不胜数&#xff0c;企业的任何一个小细节都会产生很大的影响。近几年来一直很热门的知识中台备受企业关注。关于如何高效地管理、整合和运用知识&#xff0c;成为了每一家企业都在重点关注的问题。而知识中台&#xff0c;就是为了解决这一问题而诞生的一个全…