【QT】重载的信号槽/槽函数做lambda表达式

重载的信号槽

函数指针:

int fun(int a,long b)

int (*funp)(int, long) = fun;

实现回调函数就需要函数指针

信号重载

在这里插入图片描述

派生类槽函数发送两个信号

在这里插入图片描述

派生类给父类发两个信号

在这里插入图片描述

    void (SubWidget::*mysigsub)() = &SubWidget::sigSub;
    connect(&subw,mysigsub,this,&MainWidget::slotShowMe);
    void (SubWidget::*mysigsub1)(int,QString) = &SubWidget::sigSub;
    connect(&subw,mysigsub1,this,&MainWidget::slotSubMsg);
void MainWidget::slotSubMsg(int number, QString str)
{
    qDebug()<<number<<str;
}

既然QT4在函数重载这么好用,为什么不用?

自定义信号槽必须声明
在这里插入图片描述

拓展:

一个信号可以和多个槽相连

如果是这种情况,这些槽会一个接一个的被调用,但是槽函数调用顺序是不确定的。像上面的例子,可以将一个按钮点击信号连接到关闭窗口的槽函数,同时也连接到学生请吃饭的槽函数,点击按钮的时候可以看到关闭窗口的同时也学生请吃饭的log也打印出来。

多个信号可以连接到一个槽

只要任意一个信号发出,这个槽就会被调用。如:一个窗口多个按钮都可以关闭这个窗口。

一个信号可以连接到另外的一个信号

当第一个信号发出时,第二个信号被发出。除此之外,这种信号-信号的形式和信号-槽的形式没有什么区别。注意这里还是使用connect函数,只是信号的接收者和槽函数换成另一个信号的发送者和信号函数。

//必须使用函数指针解决重载问题
void (SubWidget::*mysigsub)() = &SubWidget::sigSub;
connect(bt2,&QPushButton::pressed,this,mysigsub);
通过上面的函数,也实现了最终结果
也就是第一个信号发出时,第二个信号也被发出。

在这里插入图片描述

槽函数可以使用lambda表达式

完整代码

mainwidget.cpp

#include "mainwidget.h"
#include <QDebug>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    this->setFixedSize(400,400);
    this->setWindowTitle("QQ登陆");
    this->setWindowIcon(QIcon("/home/yangyu/DailyFILE/picture/52.jpg"));

    b3 = new QPushButton("登陆",this);
    b3->resize(80,40);
    b3->move(300,350);
    connect(b3,&QPushButton::clicked,this,&MainWidget::slotHideMe);
    void (SubWidget::*mysigsub)() = &SubWidget::sigSub;
    connect(&subw,mysigsub,this,&MainWidget::slotShowMe);
    void (SubWidget::*mysigsub1)(int,QString) = &SubWidget::sigSub;
    connect(&subw,mysigsub1,this,&MainWidget::slotSubMsg);

    b4 = new QPushButton("注册",this);
    b4->resize(80,40);
    b4->move(20,350);
    connect(b4,&QPushButton::clicked,this,&MainWidget::slotHideMe_login);
    connect(&logw,&loginwidget::loginsignal,this,&MainWidget::slotShowMe_login);
}

MainWidget::~MainWidget()
{

}
void MainWidget::slotForMainWidget()
{
    b2->setText("注销");
}
void MainWidget::slotHideMe()
{
    //隐藏自己,显示QQ邮箱
    this->hide();
    subw.show();
}

void MainWidget::slotShowMe()
{
    show();
    subw.hide();
}
void MainWidget::slotHideMe_login()
{
    //隐藏自己,显示QQ邮箱
    this->hide();
    logw.show();
}
void MainWidget::slotShowMe_login()
{
    show();
    logw.hide();
}
void MainWidget::slotSubMsg(int number, QString str)
{
    qDebug()<<number<<str;
}

subwidget.cpp

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{          //相当于主窗口的一个子窗口
   bt1 = new QPushButton(this);
   bt1->setText("确认");
   bt1->resize(0,350);

   bt2 = new QPushButton(this);
   bt2->setText("退出");
   bt2->resize(80,40);
   bt2->move(300,350);
   this->setWindowTitle("QQ邮箱");
   this->setFixedSize(400,400);
   this->setWindowIcon(QIcon("/home/yangyu/DailyFILE/picture/58.jpg"));
   connect(bt2,&QPushButton::pressed,this,&SubWidget::MySlot);

}
SubWidget::~SubWidget()
{

}
void SubWidget::MySlot()
{
    //隐藏自己,显示QQ邮箱
   emit sigSub();//发送信号
   emit sigSub(520,"666");//发送信号
}

subwidget.h

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>

class SubWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = nullptr);

    ~SubWidget();

signals:
 
   void sigSub();
   void sigSub(int num,QString str);

public slots:
   //自定义槽函数
    void MySlot();
    //void MySlot1();
private:
   QPushButton *bt1;//(确认)
   QPushButton *bt2;//(退出)隐藏自己,显示QQ登陆
};

#endif // SUBWIDGET_H

mainwidget.cpp

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include <QPushButton>
#include "subwidget.h"
#include "loginwidget.h"

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();
    //自定义槽函数
    void slotForMainWidget();
    void slotHideMe();
    void slotShowMe();
    void slotHideMe_login();
    void slotShowMe_login();

    void slotSubMsg(int number,QString str);
private:
    QPushButton* b1;
    QPushButton* b2;

    QPushButton* b3;//(登陆)隐藏自己显示QQ邮箱
    QPushButton* b4;//(注册)隐藏自己显示QQ注册
    SubWidget subw;
    loginwidget logw;
};

#endif // MAINWIDGET_H

loginwidget.cpp

#include "loginwidget.h"

loginwidget::loginwidget(QWidget *parent) : QWidget(parent)
{
    bt1 = new  QPushButton(this);
    bt1->resize(80,40);
    bt1->setText("返回");
    bt1->move(300,350);

    this->setWindowTitle("QQ注册");
    this->setFixedSize(400,400);
    connect(bt1,&QPushButton::pressed,this,&loginwidget::loginslots);
    this->setWindowIcon(QIcon("/home/yangyu/DailyFILE/picture/50.jpg"));

}
void loginwidget::loginslots()
{
    emit loginsignal();//发送自定义信号
}

loginwidget.h

#ifndef LOGINWIDGET_H
#define LOGINWIDGET_H

#include <QWidget>
#include <QPushButton>
class loginwidget : public QWidget
{
    Q_OBJECT
public:
    explicit loginwidget(QWidget *parent = nullptr);

signals://自定义信号
      void loginsignal();

public slots://自定义槽函数
      void loginslots();

private:
     QPushButton *bt1;//上一页
};

#endif // LOGINWIDGET_H

最终效果

在这里插入图片描述

槽函数做lambda表达式

不需要考虑太多,按照下面写

  connect(b3,&QPushButton::clicked,this,[=]()
    {
       b4->setText("lambda");

    });

如果槽函数很复杂,那就建议使用槽函数。

如果比较简单,可以使用lambda表达式

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

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

相关文章

农产品采购平台技术解析:Java+SpringBoot+Vue+MySQL

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

如何在2.2.1版Aduino IDE中开发ESP32

ESP32芯片集成了WIFI和蓝牙&#xff0c;而且关于生态也很不错&#xff0c;越来越多的学习者和开发者选择此类芯片&#xff0c;而不像用keil开发STM32或者51一样&#xff0c;ESP32虽然也有官方的ESP32-IDF开发软甲&#xff0c;但是经过我个人的实操体验&#xff0c;不适合小白或…

2025汤家凤考研数学,基础视频课程+百度网盘+PDF真题讲解

平时大家都半开玩笑地讲&#xff1a;我数学想要考150分&#xff01;那索性今天这一期&#xff0c;今天认真和大家聊一下&#xff1a; 想考到考研数学150分&#xff0c;应该如何准备&#xff1f; 如果还有小伙伴不知道在哪看汤神的ke&#xff0c;可以看一下以下 2025汤神全程…

力扣543. 二叉树的直径

Problem: 543. 二叉树的直径 文章目录 题目描述思路复杂度Code 题目描述 思路 1.最大直径 左子树的最大深度 右子树的最大深度&#xff1b; 2.定义一个变量maxDiameter记录最大直径&#xff0c;并编写一个递归函数maxDepth&#xff0c;利用树的后序遍历每次递归求取leftMax&a…

怎样压缩图片大小到kb?超实用技巧!

怎样压缩图片大小到kb&#xff1f;在互联网时代&#xff0c;图片已成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着图片分辨率和质量的提升&#xff0c;它们的文件大小也在不断增加&#xff0c;这不仅占用了大量的存储空间&#xff0c;还可能导致网页加载速度变慢。…

Linux中给复杂命令起别名

目录 1 前言 2 操作步骤 2.1 打开.bashrc 2.2 编辑.bashrc-添加别名 2.3 使别名生效 1 前言 在linux中有些指令会比较长&#xff0c;为了便捷的使用它们&#xff0c;我们就可以采取起别名的方式&#xff0c;具体操作如下。 2 操作步骤 2.1 打开.bashrc 输入如下指令&a…

探索Java中的函数式接口与Streams API的高级用法

引言 在Java中&#xff0c;函数式编程已经不是什么新鲜事物了。从Java 8开始&#xff0c;函数式编程的概念被引入&#xff0c;给我们带来了全新的编程范式。为什么这么多年过去了&#xff0c;咱们还在讨论它&#xff1f;因为&#xff0c;无论是对于老手还是新手程序员来说&…

web前端之uniApp实现选择时间功能

MENU 1、孙子组件1.1、html部分1.2、JavaScript部分1.3、css部分 2、子组件2.1、html部分2.2、JavaScript部分2.3、css部分 3、父组件3.1、html部分3.2、JavaScript部分 4、效果图 1、孙子组件 1.1、html部分 <template><view><checkbox-group change"ch…

如何使用 ArcGIS Pro 统计四川省各市道路长度

在某些时候&#xff0c;我们需要进行分区统计&#xff0c;如果挨个裁剪数据再统计&#xff0c;不仅步骤繁琐、耗时&#xff0c;还会产生一些多余的数据&#xff0c;这里教大家如何在不裁剪数据的情况下统计四川各市的道路长度&#xff0c;希望能对你有所帮助。 数据来源 教程…

【目标检测】1. 目标检测概述

目标检测(Object Detection)实质上上多目标的定位,即在一个图片中定位多个目标物体&#xff0c;包括分类和定位&#xff0c;也就是多个目标分别在哪里?分别属于那个类别? 图像分类常用算法: VGG GoogleNet ResNet 目标检测常用算法&#xff1a; …

It is also possible that a host key has just been changed

问题&#xff1a;ssh失败&#xff0c;提示如上图 分析: ssh的key存在上图里的路径里。 解决&#xff1a;win10删这个文件C:\Users\admin\.ssh\known_hosts , linux删这个文件.ssh\known_hosts ,或者删除这个文件里的制定ip的那一行&#xff0c;例如“106.1.1.22 ecdsa-sha2-…

2.13计算机工作过程

2.三个级别的语言 1)机器语言。又称二进制代码语言&#xff0c;需要编程人员记忆每条指令的二进制编码。机器语言是计算机唯一可以直接识别和执行的语言。 2)汇编语言。汇编语言用英文单词或其缩写代替二进制的指令代码&#xff0c;更容易为人们记忆和理解。使用汇编语言编辑的…

Redis集群(哨兵集群)

一.Sentinel作用和原理: 1.作用 监控:Sentinel会不断监控master和slave是否按预期工作. 自动故障恢复:如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也会以新的master为主。 通知&#xff1a;Sentinel充当redis客户端的服务发现来源,当集群发生故障…

uniapp模仿下拉框实现文字联想功能 - uniapp输入联想(官方样式-附源码)

一、效果 废话不多说&#xff0c;上效果图&#xff1a; 在下方的&#xff1a; 在上方的&#xff1a; 二、源码 一般是个输入框&#xff0c;输入关键词&#xff0c;下拉一个搜索列表。 ElementUI有提供<el-autocomplete>&#xff0c;但uniapp官网没提供这么细&#x…

python基于django的药品进销存管理系统elsb2

本系统是通过面向对象的python语言搭建系统框架&#xff0c;通过关系型数据库MySQL存储数据。使用django框架进行药店药品的信息管理&#xff0c;用户只需要通过浏览器访问系统即可获取药店药品信息&#xff0c;并可以在线管理&#xff0c;实现了信息的科学管理与查询统计。本文…

鸿蒙实战开发:数据交互【RPC连接】

概述 本示例展示了同一设备中前后台的数据交互&#xff0c;用户前台选择相应的商品与数目&#xff0c;后台计算出结果&#xff0c;回传给前台展示。 样例展示 基础信息 RPC连接 介绍 本示例使用[ohos.rpc]相关接口&#xff0c;实现了一个前台选择商品和数目&#xff0c;后台…

推荐一本书籍,澳福读后发现投资真谛

在现在的经济环境下&#xff0c;澳福外汇推荐各位投资读一本书籍就会发现投资者的真谛&#xff0c;那就是经济危机爆发前一年&#xff0c;黎巴嫩裔美国商人纳西姆尼古拉斯塔勒布出版的《黑天鹅:极不可能事件的影响》&#xff0c;在书中一书作者用“黑天鹅事件”这个词来指代影响…

一、项目中Camunda的使用

基本依赖请看另一篇文章 camunda学习使用 介绍 开始事件 结束事件 网关 顺序流 任务 用户任务 活动 上面是项目中使用到的一些图形&#xff0c;简单介绍一下 项目集成 依赖 <spring-boot.version>2.5.6</spring-boot.version> <spring-cloud.version>20…

智能门锁:越便宜,越难卖?

【潮汐商业评论/ 原创】 独居的Gail最近在网上种草了一款带电子猫眼的智能门锁&#xff0c;用她的话来说&#xff1a;“这小东西不仅是个电子锁&#xff0c;还是个智能监控&#xff0c;太适合独居的我了&#xff0c;天知道之前给快递员、外卖员开门都要纠结半天啊。” 但烦恼…

运维知识点-hibernate引擎-HQL

HQL有两个主要含义&#xff0c;分别是&#xff1a; HQL&#xff08;Hibernate Query Language&#xff09;是Hibernate查询语言的缩写&#xff0c;它是一种面向对象的查询语言&#xff0c;类似于SQL&#xff0c;但不是去对表和列进行操作&#xff0c;而是面向对象和它们的属性…