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

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

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

相关文章

【高时效通路】

一 高时效通路 1.1 pathchdumper 实时数据拉取、实时数据处理、5分钟微批dump来加速时效性&#xff0c;具体来说&#xff1a; 实时数据拉取&#xff08;Fetcher&#xff09;&#xff1a;基于Databus Fetcher基建&#xff0c;直接对接F0层实时拉取最新数据&#xff0c;保证该…

电脑键盘如何练习盲打?

电脑键盘如何练习盲打&#xff1f;盲打很简单&#xff0c;跟着我做&#xff0c;今天教会你。 请看【图1】&#xff1a; 【图1】中&#xff0c;红色方框就是8个基准键位&#xff0c;打字时我们左右手的8个手指就是放在这8个基准键位上&#xff0c;F键和J键上各有一个小突起&…

AcW木棒-XMUOJ恢复破碎的符咒木牌-DFS与剪枝

题目 思路 话不多说&#xff0c;直接上代码 代码 /* AcW木棒-XMUOJ恢复破碎的符咒木牌 搜索顺序&#xff1a;从小到大枚举最终的长度 len从前往后依次拼每根长度为len的木棍 优化&#xff1a; 1.优化搜索顺序&#xff1a;优先选择深度短的来搜索&#xff0c;故从大到小去枚…

Java——简易图书管理系统

本文使用 Java 实现一个简易图书管理系统 一、思路 简易图书管理系统说白了其实就是 用户 与 图书 这两个对象之间的交互 书的属性有 书名 作者 类型 价格 借阅状态 而用户可以分为 普通用户 管理员 使用数组将书统一管理起来 用户对这个数组进行操作 普通用户可以进…

Python简介

Python简介 1. Python定义 Python 是一种简单易学并且结合了解释性、编译性、互动性和面向对象的脚本语言。Python提供了高级数据结构&#xff0c;它的语法和动态类型以及解释性使它成为广大开发者的首选编程语言。 Python 是解释型语言&#xff1a; 开发过程中没有了编译这个环…

Android Gradle开发、应用、插件发布(六)—实现打包自动复制文件插件

1. 前言 项目中遇到了一个问题 : 其中一个模块MyLibrary的assets文件夹中&#xff0c;需要存放很多文件(每个文件对应一个功能)。 这样导致的问题是MyLibrary打出的这个aar包体积特别大。 如果把MyLibrary严谨地拆解成若干个Module又比较费时&#xff0c;对于现在业务现状来…

Vue3实战笔记(42)—Vue + ECharts:流量数据可视化的强大组合

文章目录 前言vue3使用echarts标准demo&#xff1a;总结 前言 在前端开发中&#xff0c;数据可视化已经成为了一个不可或缺的部分。Vue.js作为一个轻量级且易于上手的渐进式JavaScript框架&#xff0c;与ECharts这个强大的数据可视化库的结合&#xff0c;使得在Vue应用中构建交…

Mysql插入中文内容报错解决及其Mysql常用的存储引擎说明

一、问题描述 我们在Mysql数据库的表中插入带有中文内容时报错,提示【1366 - Incorrect string value: \xE5\x8C\x97\xE4\xBA\xAC... for column UserDealer at row 1】,如下图所示: 二、问题分析 一般来说插入中文内容有问题我们首先想到的就是编码问题;我们可以查看该表使…

文科论文,使用AI写作时能够提供实证数据吗?

人工智能时代&#xff0c;为了撰写论文提供思路及高效&#xff0c;利用AI撰写论文已是常态&#xff0c;可撰写文科论文通常研究中都需要实证数据&#xff0c;而AI撰写论文时能够提供这样的数据吗&#xff1f; 一、什么是实证数据 实证数据是指从研究报告、财务报表、新闻报道…

栈和队列的经典例题,LeetCode 括号匹配问题;栈实现队列;队列实现栈;队列带环问题

1.前序 又有很久没有更新文章了&#xff0c;这次带你们手撕几道基础题&#xff1b;真的就和康纳吃饭一样简单&#xff01;&#xff01;&#xff01; 如果还不会队列和栈的可以去看看之前写的博客&#xff1b; 栈的实现 队列概念以及实现 <- 快速传送 目录 1.前序 …

Jmeter例题分析-作业一

作业 作业1概要 本文档是关于执行软件性能测试的详细指南&#xff0c;包括使用JMeter工具进行测试的步骤和要求。 文档分为两个主要部分&#xff1a;性能测试的执行和性能测试报告的编写。 在第一部分中&#xff0c;详细描述了如何使用 JMeter进行性能测试。这包括设置测试环…

【机器学习】大模型在机器学习中的应用:从深度学习到生成式人工智能的演进

&#x1f512;文章目录&#xff1a; &#x1f4a5;1.引言 ☔2.大模型概述 &#x1f6b2;3.大模型在深度学习中的应用 &#x1f6f4;4.大模型在生成式人工智能中的应用 &#x1f44a;5.大模型的挑战与未来展望 &#x1f4a5;1.引言 随着数据量的爆炸性增长和计算能力的提…

LeetCode //C - 119. Pascal‘s Triangle II

119. Pascal’s Triangle II Given an integer rowIndex, return the rowIndexth (0-indexed) row of the Pascal’s triangle. In Pascal’s triangle, each number is the sum of the two numbers directly above it as shown: Example 1: Input: rowIndex 3 Output: …

Autodesk 3DS Max v2025 解锁版安装教程 (3D 建模软件)

前言 Autodesk 3ds Max 是一款功能强大的 3D 建模和动画解决方案&#xff0c;游戏开发人员、视觉效果艺术家和平面设计师使用它来创建庞大的世界、令人惊叹的场景和引人入胜的虚拟现实 (VR) 体验。 Autodesk 3DS MAX是业界使用最广泛的3D建模和动画软件程序之一&#xff0c;它…

6.小程序页面布局 - 账单明细

文章目录 1. 6.小程序页面布局 - 账单明细1.1. 竞品1.2. 布局分析1.3. 布局demo1.4. 页面实现-头部1.5. 账单明细1.5.1. 账单明细-竞品分析1.5.2. 账单明细-实现1.5.2.1. 账单明细-实现-mock数据1.5.2.2. 每日收支数据的聚合整理1.5.2.3. 页面scroll-view 1.6. TODO 1. 6.小程序…

力扣HOT100 - 72. 编辑距离

解题思路&#xff1a; 动态规划 class Solution {public int minDistance(String word1, String word2) {int n1 word1.length();int n2 word2.length();int[][] dp new int[n1 1][n2 1];for (int j 1; j < n2; j) dp[0][j] dp[0][j - 1] 1;for (int i 1; i < …

OA界面这么香吗?总有老铁私信,让我多发点,他好参考。

OA的确是B端系统应用最为广泛的一种&#xff0c;这次再给大家分享十来个页面&#xff0c;希望对他们的界面提升有所帮助。 举报 评论 3

【数据结构与算法】之堆的应用——堆排序及Top_K问题!

目录 1、堆排序 2、Top_K问题 3、完结散花 个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、堆排序 对一个无序的数组…

焦化超低排平台选哪家好?(已解答)

在环保政策日益严格的背景下&#xff0c;焦化行业的超低排放改造成为企业转型升级的必经之路。朗观视觉小编建议&#xff0c;选择合适的焦化超低排平台对于确保改造效果和实现可持续发展具有重要意义。本文将从多个维度为您提供一份全面的评估与选择指南&#xff0c;帮助您在众…

【计算机毕业设计】030英语学习交流平台微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…