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

news2024/11/25 4:26:20

重载的信号槽

函数指针:

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表达式

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

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

相关文章

网络编程:select、poll

.1、select完成TCP并发服务器 程序代码&#xff1a; #include <myhead.h> #define SER_IP "192.168.125.234" //服务端IP #define SER_PORT 8888 //服务端端口号int main(int argc, const char *argv[]) {//1.创建用于连接的套接字int sfds…

1-安装rabbitmq

rabbitmq官网&#xff1a; https://www.rabbitmq.com/docs/download 本机环境&#xff1a;mac&#xff0c;使用orbstack提供的docker 使用docker部署rabbitmq docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.13-management 然后报错&#xf…

bun 单元测试

bun test Bun 附带了一个快速、内置、兼容 Jest 的测试运行程序。测试使用 Bun 运行时执行&#xff0c;并支持以下功能。 TypeScript 和 JSX生命周期 hooks快照测试UI 和 DOM 测试使用 --watch 的监视模式使用 --preload 预加载脚本 Bun 旨在与 Jest 兼容&#xff0c;但并非所…

SD-WAN: 灵活部署,助力云服务

随着Office 365、Salesforce、Webex和SAP等云托管应用程序的迅速发展&#xff0c;企业正加速将业务关键应用程序迁移到云端。这种转变需要为遍布各地的员工提供安全可靠的云服务网络连接。本文将介绍SD-WAN如何助力企业的云服务访问。 传统的网络架构&#xff0c;特别是基于MPL…

【AI视野·今日Robot 机器人论文速览 第八十二期】Tue, 5 Mar 2024

AI视野今日CS.Robotics 机器人学论文速览 Tue, 5 Mar 2024 Totally 63 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;双臂机器人拧瓶盖, (from 伯克利) website: https://toruowo.github.io/bimanual-twist &#x1f4da;水下抓取器, (from …

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

原文地址&#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…

Linux下下载安装JDK配置Java环境变量

Linux下下载安装JDK配置Java环境变量 1. 下载JDK 下载链接&#xff1a;(https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) 2. 上传至服务器并解压 可通过shell工具进行上传&#xff0c;我这里是上传安装在/opt目录 解压jdk-17.0.10_linux-x64_b…

【外汇天眼】外汇交易策略:最容易获利的行情,原来是这一段!

不随便抄底抓顶 不能仅因为价格大跌而抄底&#xff0c;是对市场风险的尊重。 市场走势是有理由的&#xff0c;每轮下跌背后都有其深刻的基本面。 我在看书时印象深刻的是一位国外著名炒手谈到他的经历。 有一年咖啡丰收&#xff0c;价格跌得惨不忍睹&#xff0c;甚至到了一袋…

阿里二面,redis宕机了,如何快速恢复数据

背景 有个同学阿里二面&#xff0c;面试官问&#xff1a;redis宕机了&#xff0c;如何恢复数据&#xff1f; 这位同学当时一脸懵&#xff0c;不知道如何回答。 分析分析这个问题&#xff0c;redis宕机&#xff0c;要想恢复数据&#xff0c;首先redis的数据有没有做持久化&…

【AI视野·今日CV 计算机视觉论文速览 第302期】Tue, 5 Mar 2024

AI视野今日CS.CV 计算机视觉论文速览 Tue, 5 Mar 2024 Totally 177 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Brand Visibility in Packaging: A Deep Learning Approach for Logo Detection, Saliency-Map Prediction, and Logo Plac…

图论例题解析

1.图论基础概念 概念 &#xff08;注意连通非连通情况&#xff0c;1节点&#xff09; 无向图&#xff1a; 度是边的两倍&#xff08;没有入度和出度的概念&#xff09; 1.完全图&#xff1a; 假设一个图有n个节点&#xff0c;那么任意两个节点都有边则为完全图 2.连通图&…

计算机网络——24路由器组成

路由器组成 路由器的结构概况 高层面(非常简化的)通用路由器体系架构 路由&#xff1a;运行路由选择算法&#xff0f;协议 (RIP, OSPF, BGP) - 生成 路由表转发&#xff1a;从输入到输出链路交换数据报 - 根据路由表进行分组的转发 输入端口功能 分布式交换&#xff1a; 根…

【风格迁移】对比度保持连贯性损失 CCPL:解决图像局部失真、视频帧间的连贯性和闪烁

对比度保持连贯性损失 CCPL&#xff1a;解决图像局部失真、视频帧间的连贯性和闪烁 提出背景解法&#xff1a;对比度保持连贯性损失&#xff08;CCPL&#xff09; 局部一致性假设 对比学习机制 邻域调节策略 互信息最大化对比学习&#xff1a;在无需标签的情况下有效学习区分…

Yolov8改进交流

YOLO v8改进 YOLOv8的改进&#xff0c;我接触的主要分为网络改进和代码改进&#xff0c;网络改进就是以注意力、主干为主&#xff0c;代码改进就是类似于Iou&#xff0c;类别权重等修改。 以下是yolov8的原始模型。 # Ultralytics YOLO &#x1f680;, AGPL-3.0 license # YO…

防爆小型气象站

TH-FBCQX1(FB01)随着科技的进步和安全生产意识的提高&#xff0c;防爆小型气象站在危化品场所的应用越来越受到重视。这些气象站不仅能够实时监测和记录关键气象数据&#xff0c;还能够提供预警功能&#xff0c;确保危化品场所的安全运行。 一、防爆小型气象站的功能与特点 防爆…

STM32FreeRTOS消息队列(STM32Cube高效开发)

文章目录 一、队列&#xff08;一&#xff09;简介&#xff08;二&#xff09;FreeRTOS队列特点1、入队阻塞&#xff1a;队列满了&#xff0c;此时无法继续写入数据2、出队阻塞&#xff1a;队列为空&#xff0c;此时无法读出数据3、入队阻塞解除&#xff0c;有多个任务等待时&a…

史称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…

missing_aware_prompts

MSA layers [1] 辅助信息 作者使用旧版pytorch_lightning&#xff0c;不建议复现 参考文献 [1] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Łukasz Kaiser, and Illia Polosukhin. Attention is all you need. In Advance…

python+java+node.js+php基于vue的大学生体质测试管理系统16z15

陕商院学生体测管理系统&#xff0c;需要先进行登录&#xff0c;登录后确定权限&#xff0c;进行操作。包括老师管理、学生管理、首页、体质测试、公告资讯、留言板、个人中心、成绩查询功能。陕商院学生体测管理系统利用nodejs语言开发的一款基于nodejs 管理系统&#xff0c;数…

Claude 3家族惊艳亮相:AI领域掀起新浪潮,GPT-4面临强劲挑战

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-agd7RSCGMblYxo85 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…