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

news2024/11/25 0:29:33

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

public:
	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_OBJECT

public:
	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_OBJECT

public:
    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.coloradmin.cn/o/1689759.html

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

相关文章

【数据结构】排序详解(希尔排序,快速排序,堆排序,插入排序,选择排序,冒泡排序)

目录 0. 前情提醒&#xff1a; 1. 插入排序 1.1 基本思想&#xff1a; 1.2 直接插入排序 实现步骤&#xff1a; 动图演示&#xff1a; 特性总结&#xff1a; 代码实现&#xff1a; 1.3 希尔排序&#xff08;缩小增量排序&#xff09; 基本思想&#xff1a; 步骤演示&…

谷歌上架,个人号比企业号好上?“14+20”封测如何解决,你知道了吗

在Google Play上架应用&#xff0c;对开发者而言&#xff0c;既是挑战也是机遇。随着谷歌政策的不断更新&#xff0c;特别是要求2023年11月13日后注册的个人开发者账号在发布正式版应用前&#xff0c;必须经过20人连续14天的封闭测试。 这一政策的改变使得许多开发者开始考虑使…

适合小白入门的AI扩图(创成式填充)工具

近期&#xff0c;发现许多人对AI扩图工具的需求比较大&#xff0c;为了满足大家的需求&#xff0c;本期天祺为大家整理了一些好用的AI扩图工具&#xff0c;各个设配的扩图工具都有介绍哦&#xff0c;电脑&#xff0c;手机端都能用&#xff0c;大家可以根据自己的喜好和需求进行…

Linux程序开发(十):文件分类器趣味设计

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

搜索插入位置 ---- 二分查找

题目链接 题目: 分析: 因为数排序数组, 所以具有"二段性", 可以使用二分查找题目中, 我们如果找到目标值 , 则返回下标, 如果没找到目标值, 应该返回的是>target的第一个位置, 所以应该将数组分成< target 和 > target当<target时, 应该移动left, left…

Marin说PCB之POC电路layout设计仿真案例---03

今天中午午休我刚要打开手机的准备刷抖音看无忧传媒的学生们的“学习资料”的时候&#xff0c;看到CSDN -APP上有提醒&#xff0c;一看原来是一位道友发的一个问题&#xff1a; 本来小编最近由于刚刚从国外回来&#xff0c;手上的项目都已经结束了&#xff0c;这周开始学习仿真…

Xcode=> 安装 simulator

XCode xcode中下载 simulator 点击加号➕&#xff0c;选择对应的版本&#xff0c;即可下载 下载完成&#xff1a; 其他下载办法 因为使用上述下载&#xff0c;会经常性的出现断开&#xff0c;再次下载又是从头开始&#xff0c;太费时费力。下面使用下载地址&#xff0c;然后用…

软考中级-软件设计师-真题详解【2023年上半年】

2023上半年真题记忆点详解 本片不涉及解题法&#xff0c;只整理记忆背诵点&#xff0c;记住即可拿分。 上午题部分&#xff1a; 片内总线&#xff1a;用于芯片内部各主要部件连接&#xff1b; 系统总线&#xff1a;用于CPU、主存、外设见的数据传输&#xff1b; 通讯总线&…

百度信息流 - 成本保障未生效?

今天创建百度信息流单元时&#xff0c;发现一个细节&#xff0c;创建好后&#xff0c;成本保障未生效&#xff08;“保”字没有出现&#xff09; 过了一会&#xff0c;再进来看&#xff0c;成本保障生效了。 分析原因 &#xff1a; 展现为 1 &#xff0c;也就是说&#xff0c;一…

建筑施工突发事故应急处置vr安全培训平台

在不断发展的时代背景下&#xff0c;掌握必要的应急安全知识已成为我们生活中不可或缺的一部分。由央企携手我们华锐推出的3D线上应急宣教虚拟体验馆&#xff0c;标志着民众应急安全教育的全新里程碑&#xff0c;不仅突破了传统学习模式的局限&#xff0c;还让每个人都能在灵活…

GpuMall智算云:Ubuntu 实例桌面版

基于 ubuntu18.04 安装的桌面版本&#xff0c;桌面使用 xfce4 &#xff0c;集成了 Pytorch2.3.0、cuda11.8、Python3.10、VNC、noVNC、VSCode-Server。 在 镜像市场 选择xfce4-desktop镜像&#xff0c;然后进行创建实例 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall…

这八个步骤,有效进行防错管理

导读 在产品实际的生产过程中&#xff0c;因零件相似而错装、因零件又小又多而漏装等现象时有发生&#xff0c;需要防止或尽可能避免错误发生。 试想&#xff0c;一个操作人员每天进行同样的装配工作上百次千次甚至上万次&#xff0c;如果产品设计和过程设计开发不能防止提前预…

vue.js状态管理和服务端渲染

状态管理 vuejs状态管理的几种方式 组件内管理状态&#xff1a;通过data&#xff0c;computed等属性管理组件内部状态 父子组件通信&#xff1a;通过props和自定义事件实现父子组件状态的通信和传递 事件总线eventBus&#xff1a;通过new Vue()实例&#xff0c;实现跨组件通…

Pytorch入门(7)—— 梯度累加(Gradient Accumulation)

1. 梯度累加 在训练大模型时&#xff0c;batch_size 最大值往往受限于显存容量上限&#xff0c;当模型非常大时&#xff0c;这个上限可能小到不可接受。梯度累加&#xff08;Gradient Accumulation&#xff09;是一个解决该问题的 trick梯度累加的思想很简单&#xff0c;就是时…

第12周作业--HLS入门

目录 一、HLS入门 二、HLS入门程序编程 创建项目 1、点击Vivado HLS 中的Create New Project 2、设置项目名 3、加入文件 4、仿真 3、综合 一、HLS入门 1. HLS是什么&#xff1f;与VHDL/Verilog编程技术有什么关系? HLS&#xff08;High-Level Synthesis&#xff0c…

自动化重置数据库功能的探索与实践

1、简介 在现代软件开发中&#xff0c;尤其是涉及到数据驱动的应用程序时&#xff0c;开发和测试环境中数据库的管理是至关重要的一环。为了确保开发和测试环境中的数据库始终处于一致的状态&#xff0c;自动化重置数据库成为了一种常见的实践。本文旨在介绍如何通过Shell脚本…

打印9*9乘法表(递归或压缩矩阵)python

打印9*9表def print_multiplication_table(row, col):if row > 10:return # 递归结束条件if col row:print() # 换行print_multiplication_table(row 1, 1) # 递归调用下一行else:print(f"{row-1} * {col} {(row-1) * col}\t", end"") # 打印乘法…

小程序properties默认值定义及父子组件的传值

因经常写vue&#xff0c;很久没写小程序&#xff0c;容易串频道&#xff0c;现记录一下小程序的组件用法、监听传入值及父子传值方式 首先小程序中传值是没有&#xff1a;(冒号)的&#xff0c;其次properties中定义默认值不需要写default 1.自定义组件中&#xff0c;首先json…

TransFormer学习之基础知识:STN、SENet、CBAM、Self-Attention

1.空间注意力机制STN 参考链接&#xff1a;STN(Spatial Transformer Networks) 参考链接&#xff1a;通俗易懂的Spatial Transformer Networks(STN) 核心动机&#xff1a; 在空间中捕获重要区域特征(如图像中的数字)&#xff0c;将核心区域进行放大居中&#xff0c;使得结果更…

2461. 长度为 K 子数组中的最大和(c++)

给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和&#xff1a; 子数组的长度是 k&#xff0c;且子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件&#xff0c;返回 0 。 子数…