【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.hqwc.cn/news/512334.html

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

相关文章

Js实现通过下拉框选择关键字(带图)

<!DOCTYPE html> <html> <head><title>下拉框搜索图片</title><script>// 图片数据var images {"日出": "1.jpg","小猫": "2.jpg","萝莉": "3.png"};// 当下拉框的选项改变…

C++--机器人的运动范围

目录 1. 题目 2. 思路 3. C代码测试 4. 测试结果 1. 题目 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动&#xff0c;每一次只能向左&#xff0c;右&#xff0c;上&#xff0c;下四个方向移动一格&#xff0c;但是不能进入行坐标和列坐标的数位之和大于k的格…

二百二十六、Linux——shell脚本查看今天日期、昨天日期、30天前日期、1月前日期

一、目的 由于磁盘资源有限&#xff0c;因为对原始数据的保存有事件限制&#xff0c;因为对于超过一定期限的数据文件则需要删除&#xff0c;要实现定期删除则第一步就是查看日期时间 二、在Linux中创建shell脚本 #! /bin/bash source /etc/profile nowdatedate --date0 da…

Reqable爬虫抓包工具(国产网络调试工具)

官网界面截图&#xff1a; 官网地址&#xff1a;https://reqable.com/zh-CN/windows/ 历史由来&#xff1a; Reqable的前身是HttpCanary&#xff08;一款Android平台应用程序&#xff09;&#xff0c;但是国内开发者推翻了所有的技术栈&#xff0c;并用C和Flutter重写&#x…

抖店怎么选品?所谓的品感,无非就是快速发现产品的卖点和属性

我是王路飞。 今天想跟你们聊聊抖店的核心-选品。 其实这也是整个电商行业的核心&#xff0c;你所有的运营手段都是围绕产品去展开的&#xff0c;产品不行&#xff0c;一切都白搭。 至于【品感】这个词&#xff0c;相信你们也不陌生&#xff0c;也是很多有经验的老玩家经常给…

《低代码平台开发实践:基于React》读书心得与实战体验

低代码平台开发实践标题 &#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 一、引…

QT对象树 | 内存泄漏

使用 Qt 框架构建 GUI 界面的程序 //widget.cpp #include "widget.h" #include "ui_widget.h" #include <QLabel>Widget::Widget(QWidget *parent) //这里的parent的意思是父级指针: QWidget(parent) //调用父类的构造函数, ui(new Ui::Widget) …

智慧城市中的数字孪生:数字孪生技术助力智慧城市提高公共服务水平

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、智慧交通管理 2、智慧能源管理 3、智慧环保管理 4、智慧公共安全 四、数字孪生技术助力智慧城市提高公共服务水平的价值 五、挑战与前景 六、结论 一、引言 随着信息技术的飞速发展&…

成功交付 | 精益DevOps

⭐简单说两句⭐ 作者&#xff1a;后端小知识&#xff0c;CSDN后端领域新星创作者|阿里云专家博主 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 按需交付服务从…

python网络爬虫教程笔记(1)

系列文章目录 文章目录 系列文章目录前言一、爬虫入门1.爬虫是什么&#xff1f;2.爬虫工作原理3.爬虫基本原理4.工作流程5.HTTP请求6.HTTP响应7.HTTP原理&#xff1a;证书传递、验证和数据加密、解密过程解析8.Urllib.request库的使用9.TCP3次握手&#xff0c;4次挥手过程 总结…

Express学习(一)

Express Express简介 什么是Express 官方给出的概念&#xff1a;Express是基于Node.js平台&#xff0c;快速、开放、极简的web开发框架。 通俗的理解&#xff1a;Express的作用和Node.js内置的http模块类似&#xff0c;是专门用来创建Web服务器的。进一步理解Express 不使用E…

ssm+springboot音乐播放器网站mybatis+jsp

测试流程 &#xff08;1&#xff09; 登录系统、填写用户名、密码选择角色&#xff0c;主要内容&#xff1a;进行权限控制。 &#xff08;2&#xff09; 用户查看音乐信息、音乐资讯功能&#xff0c;主要是测试系统实用性、方便性。 &#xff08;3&#xff09; 信息修…