【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_OBJECTpublic: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表达式

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

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

相关文章

Linux命令高效的4个shell替代工具

文章目录 前言1.Top1.1 htop1.2 btop1.3 glances 2.df2.1 duf 3.ls3.1 eza 4.cat4.1 bat 前言 Unix系统发展了好多年了&#xff0c;不论是各开源发行版的linux还是封闭商业化的MacOS&#xff0c;上古流传的古董命令依旧在终端发挥着重要作用&#xff0c;但其实使用体验感觉还是…

2024年Android开发进阶课程,面试一路绿灯Offer拿到手软

职业生涯规划 Android系统的市场地位 Android程序开发的技能成长经验 Android程序员为什么需要学习Html5 Android软件工程师为什么不会被前端替代 为什么小程序无法替代原生开发 为什么Html5无法取代NativeAPP Html5在Android中的应用场景 如何成为一名合格的高级Android程序员…

C及C++每日练习(1)

一.选择&#xff1a; 1.以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x); A.是无限循环 B.循环次数不定 C.4次 D.3次 对于循环&#xff0c;其组成部分可以四个部分&#xff1a; for(初始化;循环进行条件;调整) …

【QA-SYSTEMS】CANTATA-解决Jenkins中build Cantata报错

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 解决Jenkins中build Cantata测试项目报找不到license server的错误。 2、 问题场景 在Jenkins中build Cantata测试项目&#xff0c;报错“Failed to figure out the license server correctly”。 3、软硬件环…

Numpy教程

文章目录 数组基础文件与字符串多项式分布实战 Numpy绝对可以说是支撑Python地位的最重要的包了&#xff0c;几乎所有能叫出名的Python计算库&#xff0c;都不可避免地调用了Numpy&#xff0c;Numpy官网也列出了一些&#xff0c;大致如下图这样&#xff0c;在科学计算领域&…

Spring事务管理与模板对象

1.事务管理 1.事务回顾 事务指数据库中多个操作合并在一起形成的操作序列 事务的作用 当数据库操作序列中个别操作失败时&#xff0c;提供一种方式使数据库状态恢复到正常状态&#xff08;A&#xff09;&#xff0c;保障数据库即使在异常状态下仍能保持数据一致性&#xff…

android开发教程百度网盘,高并发系统基础篇

展望未来 操作系统 移动操作系统的演变过程&#xff0c;从按键交互的塞班功能机到触摸屏交互的Android/IOS智能机&#xff0c;从小屏幕手机到全面屏、刘海屏、水滴屏。任何系统无非干两件事&#xff1a;输入和输出&#xff0c;接收到外部输入信号后经过操作系统处理后输出信息…

史称GPT-4最强劲敌——Claude 3 大模型它来了【附体验教程】

Anthropic 的 Claude 3 Sonnet 模型现已在亚马逊云科技的 Amazon Bedrock 正式可用。 Amazon Bedrock 是目前 第一个 也是 唯一 一个提供 Claude 3 Sonnet 的托管服务 。 Claude 3 免费测试体验者福利&#x1f9e7;&#xff1a;https://mp.weixin.qq.com/s/hszLRa8B5zKsTDg2bmI…

Java两周半速成之路(第七天)

一.多态 3.多态的好处: 提高了程序的维护性(由继承保证) 提高了程序的扩展性(由多态保证) 演示&#xff1a; package com.shujia.day08;public class Animal {String name;int age;public Animal() {}public Animal(String name, int age) {this.name name;this.age age…

安装/升级 gcc

文章目录 查看当前 gcc 版本查看 yum 软件库 gcc 版本列表下载最新版本安装 查看当前 gcc 版本 查看 yum 软件库 gcc 版本列表 只有一个4.8的版本&#xff0c;过旧 下载最新版本 wget https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.gz 安装 ./configure 报错 提示…

2024年Android开发者跳槽指南,超强Android进阶路线知识图谱

一、概述 随着业务的发展&#xff0c;工程的逐渐增大与开发人员增多&#xff0c;很多工程都走向了模块化、组件化、插件化道路&#xff0c;来方便大家的合作开发与降低业务之间的耦合度。现在就和大家谈谈模块化的交互问题&#xff0c;首先看下模块化的几个优势。 模块化的优…

国创证券|645元克!买还是不买?

近日世界金价继续走强。截至记者发稿&#xff0c;纽约商业交易所&#xff08;COMEX&#xff09;黄金主力4月合约突破2100美元/盎司关口&#xff1b;国内方面&#xff0c;SHFE黄金主力合约则摸高498元/克&#xff0c;迫临500元/克的关口。 巨丰投顾高级出资参谋游晓刚对《证券日…

替代TPS7B7701QPWPRQ1/TPS7B7702QPWPRQ1单/双通道 车规级LDO

PC8803具有高输入电压单低压差调节器&#xff08;PC8803SC01/PC8803SCO3&#xff09;/双通道低压差调节&#xff08;PC8803SC02/PC8803SC04&#xff09;&#xff0c;具有精确的电流感测&#xff0c;设计用于在宽输入电压范围内工作 从4.5V到40V。该设备具有45V负载转储电源输入…

微信小程序触屏事件_上划下划事件

一、微信小程序触屏事件 bindtouchstart&#xff1a;手指触摸动作开始 bindtouchmove&#xff1a;手指触摸后移动 bindend&#xff1a;手指触摸动作结束 属性类型说明touchesArray触摸事件&#xff0c;当前停留在屏幕中的触摸点信息的数组 Touch 对象 属性类型说明identi…

pgvector docker部署测试

docker pull pgvector/pgvector:pg16 运行 docker run --name pgvector --restartalways -e POSTGRES_USERpgvector -e POSTGRES_PASSWORDpgvector -v /srv/tlw/pgvectordata:/var/lib/postgresql/data -p 54333:5432 -d pgvector/pgvector:pg16 CREATE EXTENSION vector; --…

总结:大模型技术栈---算法与原理

原文地址&#xff1a;大模型技术栈-算法与原理 1. tokenizer方法 word-level char-level subword-level BPE WordPiece UniLM SentencePiece ByteBPE2. position encoding 绝对位置编码 ROPE AliBi 相对位置编码 Transformer-XL T5/TUPE DeBERTa3. 注意力机制 Mamba,H3,Hyena…

【Redis】Redis持久化模式RDB

目录 引子 RDB RDB的优缺点 小节一下 引子 不论把Redis作为数据库还是缓存来使用&#xff0c;他肯定有数据需要持久化&#xff0c;这里我们就来聊聊两种持久化机制。这两种机制&#xff0c;其实是 快照 与 日志 的形式。快照:就是当前数据的备份&#xff0c;我可以拷贝到磁…

C语言指针的初步认识--学习笔记(3)

1. 字符指针变量 在C语言中&#xff0c;字符串通常被视为字符数组&#xff0c;但它们可以有不同的表示方式。字符指针变量存储的是字符串的地址。这意味着&#xff0c;当你有一个字符串时&#xff0c;你可以通过改变字符指针的值来改变这个字符串&#xff0c;因为你实际上改变的…

保修期内经营者收取维修费用应遵循正当程序原则

↑↑↑“上海高院”头条号为您讲述精彩的法律科普内容 上海市第一中级人民法院在履行司法审判职能的同时&#xff0c;始终高度重视高质量案件工作&#xff0c;总结司法审判经验&#xff0c;努力提高司法审判质量。 在2020年全国法院系统优秀案例分析评选活动中&#xff0c;上海…

合并有序链反转链表(递归版)

每日一题系列&#xff08;day 19&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50…