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

需求:
下班后,小明说请小红吃好吃的,随便吃,吃啥买啥
无参:小红没有提出吃啥
有参:小红提出自己想吃的东西,吃啥取决于一时兴起(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.mzph.cn/diannao/14999.shtml

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

相关文章

Unreal Engine5 Landscape地形材质无法显示加载

UE5系列文章目录 文章目录 UE5系列文章目录前言一、解决办法 前言 在使用ue5做地形编辑的时候&#xff0c;明明刚才就保存的Landscape地形完全消失不见&#xff0c;或者是地形的材质不见了。重新打开UE5发现有时候能解决&#xff0c;但大多数时候还是没有解决&#xff0c;我下…

如何在 ASP.NET Core 中实现中间件管道

概述:借助 ASP.NET Core,中间件流水线可以作为一种轻量级、灵活的机制,使开发人员能够在请求流水线的不同阶段插入功能。这些中间件组件可以执行各种任务,例如日志记录、身份验证、授权、异常处理等。它们提供了一种封装和组织代码的方法,促进了更简洁、更易于维护的应用程…

聚观早报 | 华为畅享 70S真机图赏;vivo Y200 GT开售

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月25日消息 华为畅享 70S真机图赏 vivo Y200 GT开售 一加13部分细节曝光 马斯克谈AI未来 三星Galaxy Z Fold6将…

有一个3x4的矩阵,要求编写程序求出其中值最大的那个元素,以及其所在的行号和列号

解题思路&#xff1a; 先考虑解此问题的思路。从若干数中求最大数的方法很多&#xff0c;现在采用"打擂台"的算法。如果有若干人比武&#xff0c;先有一人站在台上&#xff0c;再上去一人与其交手&#xff0c;败者下台&#xff0c;胜者留在台上。第3个人再上…

Font shape `U/rsfs/m/n‘ in size <29.86> not available size <24.88>

解决方法&#xff1a;mathrsfs 删除这个包 其他可以参考&#xff1a;koma script - Size substitution with fontsize14 - TeX - LaTeX Stack Exchange

【C语言】深入理解指针(一)(中)

2、指针变量和解引用操作符&#xff08;*&#xff09; &#xff08;1&#xff09;指针变量 我们通过取地址操作符&#xff08;&&#xff09;拿到的地址是一个数值&#xff0c;比如&#xff1a;0x006FFD70&#xff0c;这个数值有时候是需要存储起来&#xff0c;方便后期再…

详解最新版RabbitMQ 基于RPM 方式的安装

如何选择安装版本 已经不支持的发布系列 版本最后补丁版本首次发布时间停止更新时间3.73.7.282017年11月28日2020年09月30日3.63.6.162015年12月22日2018年05月31日3.53.5.82015年03月11日2016年10月31日3.43.4.42014年10月21日2015年10月31日3.33.3.52014年04月02日2015年03…

Mybatis Cache(一)MybatisCache+Redis

前面提到了&#xff0c;使用mybatis cache&#xff0c;一般是结合redis使用。 一、demo 1、数据表 create table demo.t_address (id int auto_incrementprimary key,address_name varchar(200) null,address_code varchar(20) null,address_type int n…

计算机毕业设计Python+Scrapy+Vue.js机器学习招聘推荐系统 招聘数据可视化 招聘爬虫 招聘数据分析 大数据毕业设计 大数据毕设

桂林学院 本科生毕业论文&#xff08;设计、创作&#xff09;开题报告 二级学院 理工学院 专业 数据科学与大数据技术&#xff08;专升本&#xff09; 年级 2022级 姓名 徐彬彬 学号 202213018222 指导教师 沈岚岚 职称/学位 高级实验师 第二 导师 职称/学…

【ZYNQ】AXI-Quad-SPI SDK 开发记录 测试

前人工作 如前人工作&#xff0c;在Navigate to BSP Settings中找到历例程 file:///F:/Xilinx/Vitis/2019.2/data/embeddedsw/XilinxProcessorIPLib/drivers/spi_v4_5/doc/html/api/example.html使用XSpi_LowLevelExample例子&#xff0c;源代码的AI解析 int XSpi_LowLeve…

Java使用apache.poi生成word

加油&#xff0c;打工人&#xff01; 工作需求&#xff0c;将现有的word模板有段落和表格&#xff0c;从数据库中查出数据并填充&#xff0c;word里面也有表格数据&#xff0c;需要将excel表格数据单独处理&#xff0c;然后插入到生成好的word文档中。 下面代码模拟从数据库查出…

Kubernetes——Kubectl详解

目录 前言 一、陈述式资源管理方法 二、Kubectl命令操作 1.查 1.1kubectl version——查看版本信息 1.2kubectl api-resources——查看资源对象简写 1.3kubectl cluster-info——查看集群信息 1.4配置Kubectl补全 1.5journalctl -u kubelet -f——查看日志 1.6kubec…

物联网应用开发--STM32与机智云通信(ESP8266 Wi-Fi+手机APP+LED+蜂鸣器+SHT20温湿度传感器)

实现目标 1、熟悉机智云平台&#xff0c;会下载APP 2、熟悉新云平台创建产品&#xff0c;项目虚拟调试 3、掌握云平台生成MCU代码&#xff0c;并移植。机智云透传固件的下载 4、具体目标&#xff1a;&#xff08;1&#xff09;注册机智云平台&#xff1b;&#xff08;2&…

148.【Windows DOS命令脚本文件】

Window待处理脚本 (一)、批处理编程初步体验1.什么是批处理程序&#xff1f;(1).批处理程序的定义(2).如何编辑批处理程序 2.批处理程序可以做什么&#xff1f;(1).匹配规则删除文件(2).新建文件&#xff0c;日志等(3).创建计算机病毒等 3.一个基本的批处理文件(1).带盘符的输出…

[深入理解DDR5] 2-1 封装与引脚

3500字&#xff0c;依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR》 1 DDR5 颗粒 X4 X8 X16 这里的 X8 or X16&#xff0c; 可以理解为一个DRAM芯片有几个存储阵列。“X几”。进行列寻址时会同时从几个阵列的同一个坐标位置读出数据bit来&a…

前端中 dayjs 时间的插件使用(在vue 项目中)

Day.js中文网 这是dayjs的中文文档 里面包括了使用方法 下面我来详细介绍一下这个插件的使用 Day.js 可以运行在浏览器和 Node.js 中。 一般咱直接是 npm 安装 npm install dayjs 目前应该使用的是Es6 的语法 import dayjs from dayjs 当前时间 直接调用 dayjs() 将返回…

【飞桨AI实战】基于PP-OCR和ErnieBot的智能视频问答

前言 本次分享将带领大家从 0 到 1 完成一个基于 OCR 和 LLM 的视频字幕提取和智能视频问答项目&#xff0c;通过 OCR 实现视频字幕提取&#xff0c;采用 ErnieBot 完成对视频字幕内容的理解&#xff0c;并回答相关问题&#xff0c;最后采用 Gradio 搭建应用。本项目旨在帮助初…

小猫咪的奇幻冒险:一个简单的Python小游戏

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、游戏简介与演示 二、游戏开发与运行 1. 环境搭建 2. 代码解析 3. 加速机制 三、游戏…

Jeecg | 完成配置后,如何启动整个项目?

前端启动步骤&#xff1a; 1. 以管理员身份打开控制台&#xff0c;切换到前端项目目录。 2. 输入 pnpm install 3. 输入 pnpm dev 4. 等待前端成功运行。 可以看到此时前端已经成功启动。 后端启动步骤&#xff1a; 1. 启动 mysql 服务器。 管理员身份打开控制台&#…

得物小程序逆向+qt可视化(不含sku)

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…