【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式


  • 博客主页:Duck Bro 博客主页
  • 系列专栏:Qt 专栏
  • 关注博主,后期持续更新系列文章
  • 如果有错误感谢请大家批评指出,及时修改
  • 感谢大家点赞👍收藏⭐评论✍

Qt信号和槽的其他说明及Lambda表达式

文章编号:Qt 学习笔记 / 13

文章目录

  • Qt信号和槽的其他说明及Lambda表达式
    • 一、断开信号和槽
      • 1. disconnect
      • 2. 代码示例
    • 二、Qt4 版本信号与槽的连接
      • 1. 代码示例
      • 2. Qt4 版本信号与槽连接的优缺点
    • 三、Lambda 表达式
      • 1. 局部变量引入方式 [ ]
      • 2. 函数参数 ( )
      • 3. 选项Opt
      • 4. Lambda表达式的返回值类型
      • 5. Lambda表达式的函数体 { }
      • 6. Lambda表达式的使用示例


一、断开信号和槽

1. disconnect

在Qt中disconnect和connect的使用方式类似,使用disconnect就可以断开链接。

disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)

2. 代码示例

设置两个按钮,第一个按钮改变窗口标题为“标题1”,第二个断开第一个按钮的连接并连接新的槽函数修改标题为“标题2”
在这里插入图片描述

在这里插入图片描述
文件代码:

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void handleClikcked();
    void handleClikcked2();

private slots:
    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

//widget.cpp
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClikcked);

}

Widget::~Widget()
{
    delete ui;
}

void Widget::handleClikcked()
{
    this->setWindowTitle("标题1");
}

void Widget::handleClikcked2()
{
    this->setWindowTitle("标题2");
}


void Widget::on_pushButton_2_clicked()
{
    //断开连接按钮1连接
    disconnect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClikcked);
    //重新连接新的槽
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClikcked2);
}

二、Qt4 版本信号与槽的连接

1. 代码示例

Qt4 中的 connect ⽤法和 Qt5 相比是更复杂的. 需要搭配 SIGNAL 和 SLOT 宏来完成.
而且缺少必要的函数类型的检查,使代码更容易出错,在没有特殊需要时建议还是使用Qt5的用法

  • 在widget.h文件中声明信号和槽
    在这里插入图片描述
  • 在widget.cpp文件中实现槽函数、连接信号和槽
    在这里插入图片描述

2. Qt4 版本信号与槽连接的优缺点

Qt4 版本中,信号与槽是通过使用 QObject 类的 connect() 函数进行连接的。以下是 Qt4 版本信号与槽连接的优点和缺点:

优点:

  1. 灵活性:信号与槽机制可以实现多对多的连接,一个信号可以连接多个槽,一个槽也可以连接多个信号。这种灵活性可以方便地实现复杂的交互逻辑。
  2. 松耦合:通过信号与槽机制,不同对象之间可以进行解耦,一个对象可以发送信号,而不需要知道是哪个对象接收这个信号,也不需要知道有哪个槽函数与之关联。
  3. 线程安全:在多线程环境下,信号与槽机制可以保证线程安全,当一个信号触发时,会在槽函数所属的线程中被执行,避免了多线程中的竞争条件问题。

缺点:

  1. 静态类型检查不够严格:由于信号与槽机制是通过字符串来连接的,所以在编译阶段无法进行静态类型检查,只能在运行时进行。这导致一些潜在的错误只能在运行时才能发现。
  2. 存在性能开销:信号与槽机制的实现需要维护一个信号槽映射表,以及一些其他的数据结构,这会带来一定的性能开销。对于一些对性能要求较高的场景,可能需要考虑其他的实现方式。
  3. 没有自动解除连接:在 Qt4 版本中,需要显式地调用 QObject 类的 disconnect() 函数来断开信号与槽的连接,否则可能会导致内存泄漏或者未定义的行为。这需要开发者手动管理连接,增加了一定的复杂性。

图片示例:

在这里插入图片描述


三、Lambda 表达式

在Qt中,Lambda表达式是一种方便的方式来编写匿名函数。Lambda表达式可以用于连接信号和槽,处理事件和回调函数等。
Lambda表达式的语法格式如下:

 [ capture ] ( params ) opt -> ret { 
 Function body; 
 };
参数名称
capture捕获列表
params参数表
opt函数选项
ret返回值类型
Function body函数体

1. 局部变量引入方式 [ ]

在Lambda表达式中 [ ] : 标识⼀个 Lambda表达式 的开始。不可省略。

符号说明
[ ]局部变量捕获列表。Lambda表达式不能访问外部函数体的任何局部变量
[a]在函数体内部使用值传递的方式访问a变量
[&b]在函数体内部使用引用传递的⽅式访问b变量
[=]函数外的所有局部变量都通过值传递的方式使用, 函数体内使用的是副本
[&]以引用的方式使用Lambda表达式外部的所有变量
[=, &foo]foo使用引用方式, 其余是值传递的方式
[&, foo]foo使用值传递方式,其余引用传递
[this]在函数内部可以使⽤类的成员函数和成员变量,= 和 & 形式也都会默认引入

说明:

  • 由于使用引用方式捕获对象会有局部变量释放了⽽Lambda函数还没有被调⽤的情况。如果执行 Lambda函数,那么引用传递方式捕获进来的局部变量的值不可预知。所以绝大多数场合使用的形 式为: [=] () { }
  • 早期版本的 Qt,若要使⽤Lambda表达式,要在 “.pro” ⽂件中添加: CONFIG += C++11 因为 Lambda表达式 是 C++11 标准提出的。Qt5 以上的版本无需手动添加,在新建项⽬时会自动 添加。
    在这里插入图片描述

2. 函数参数 ( )

(params) 表示 Lambda函数对象接收的参数,类似于函数定义中的小括号表示函数接收的参数类型和个数。参数可以通过按值(如:(int a,int b))和按引用(如:(int &a,int &b))两种⽅式进行传递。函数参数部分可以省略,省略后相当于⽆参的函数。

3. 选项Opt

Opt 部分是可选项,最常用的是 mutable声明 ,这部分可以省略。
Lambda表达式外部的局部变量通过值传递进来时,其默认是 const,所以不能修改这个局部变量的拷贝,加上mutable 就可以修改。

4. Lambda表达式的返回值类型

可以指定 Lambda表达式 返回值类型;如果不指定返回值类型,则编译器会根据代码实现为函数推导⼀个返回类型;如果没有返回值,则可忽略此部分。

5. Lambda表达式的函数体 { }

Lambda表达式的函数体部分与普通函数体⼀致。用 { } 标识函数的实现,不能省略,但函数体可
以为空。

6. Lambda表达式的使用示例

代码示例:

  • 示例1:点击按钮关闭窗口;
    在这里插入图片描述
  • 示例2:当 “connect” 函数第三个参数为 “this” 时,第四个参数使用 Lambda表达式时,可以省略掉"this"
    在这里插入图片描述

在这里插入图片描述

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

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

相关文章

ctfshow--web入门--文件上传--web168--web170

web168 法一免杀脚本 还是检查&#xff0c;准备上传图片马 我写的是<?php eval($_POST[a]);?> 上传之后没反应 那么查一下&#xff0c;原来是发现对eval,system还有$_POST和$_GET进行过滤,$_REQUEST还可以用 那么再写一个马&#xff08;免杀脚本&#xff09; <?…

ht1622不显示无反应问题解决

如果你正在写ht1622 驱动时&#xff0c;怎么看程序都没问题&#xff0c;抓取波形&#xff0c;示波器分析波形&#xff0c;如果都没有问题&#xff0c;那么很大可能是硬件问题&#xff0c;检测看看 ht1622 RD是不是接地了。 RD 低会进入读取模式&#xff0c;所以不用RD 请将RD悬…

2024年河北省职业院校技能大赛高职组“信息安全管理与评估”赛项样题

培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;775454947 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技能提升&#xff0c;受赋能的客户院校均…

某次众测的加解密对抗

前言 起源于某次众测中&#xff0c;遇到请求包响应包全密文的情况&#xff0c;最终实现burp中加解密。 用到的工具有 sekiro&#xff08;rpc转发&#xff09;flask&#xff08;autodecoder自定义接口&#xff09;autodecoder&#xff08;burp插件转发&#xff09; debug部分…

<网络> 网络Socket编程基于TCP协议模拟简易网络通信

目录​​​​​​​ 前言&#xff1a; 一、字符串回响 &#xff08;一&#xff09;程序结构 &#xff08;二&#xff09;初始化服务器 &#xff08;三&#xff09;启动服务器 1. 处理连接请求 2. 业务处理 3. 回调函数 &#xff08;四&#xff09;填充server源文件 &…

公司刚招了一个5年测试,竟然连抓包都不会

大家都知道&#xff0c;无论是测试人员还是开发人员&#xff0c;移动端抓包都是必须掌握的关键技能。然而还有人在测试岗位上干了这么久&#xff0c;还是不懂如何进行抓包&#xff01;今天就跟大家分享两款在日常工作中常用的抓包工具&#xff1a;Fiddler和Charles Fiddler和C…

94岁诺奖得主希格斯去世,曾预言「上帝粒子」的存在

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 一位用诗意的语言揭示宇宙秘密的人。 一位 94 岁伟大科学家的逝世&#xff0c;引发了人们广泛…

分布式事务方案与Seata详解

分布式事务与Seata详解 一、分布式事务1.什么是分布式事务2.分布式事务解决方案-2PC3.分布式事务解决方案-3PC4.分布式事务解决方案-TCC5.分布式事务解决方案-XA6.可靠消息最终一致性6.1 本地消息表6.2 事务消息 7.最大努力通知8.SAGA9.分布式事务解决方案思考 二、Seata 简介与…

pytesseract,一个超强的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - pytesseract。 Github地址&#xff1a;https://github.com/madmaze/pytesseract 在当今数字化时代&#xff0c;文字识别技术扮演着越来越重要的角色。…

基于sd的单分支和双分支方案

单分支&#xff1a; 1.ip-adapter 2.photomaker 3.CLE-Diffusion 4.powerpaint 5.videocomposer 6.animateanything 7.pixeldance 8.aniamtediff 双分支&#xff1a; 1.controlnet 2.instanceid 3.brushnet 4.ootdiffusion 5.MagicAnimate 7.animateanyone

《QT实用小工具·十七》密钥生成工具

1、概述 源码放在文章末尾 该项目主要用于生成密钥&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain.h" #include "qmessag…

qtablewidget 事件过滤器 鼠标事件不生效

1. 创建了一个MouseEventFilter类&#xff0c;它覆盖了eventFilter()方法来拦截鼠标按下事件。然后&#xff0c;我们将这个事件过滤器安装到了QTableWidget上 2.记得注册事件过滤器 3.这里是头文件 看一下就行 4.return true代表事件被处理&#xff0c;不需要再处理&#xff…

深入了解Redis——哨兵机制

三&#xff0c;Redis哨兵机制 Redis的哨兵机制主要是为了提高Redis主从模型下的可用性&#xff0c;能保证主节点异常发生时还能够正常的运作并进行故障转移。哨兵机制为了实现这一点提供了以下这些功能&#xff1a; 节点监控下线判断领导者选举slave选举故障转移 在介绍这些…

目标检测——车牌图像数据集

一、重要性及意义 车牌图像识别的重要性及意义主要体现在以下几个方面&#xff1a; 智能交通管理&#xff1a;车牌图像识别技术是智能交通系统&#xff08;ITS&#xff09;的核心组成部分。通过自动识别车辆车牌&#xff0c;可以实现对交通违章行为的自动记录和处理&#xff…

【数据库】数据库应用系统生命周期

目录 1.为什么提出”软件工程“的思想&#xff1f; 2.为什么提出”瀑布模型“&#xff1f;缺点是什么&#xff1f; 3.为什么提出”快速原型模型“&#xff1f; 4.为什么提出”螺旋模型“&#xff1f; 5.关于数据库的英文缩写。 6.模型设计中的3条设计主线&#xff1a;数…

OpenHarmony分布式软总线API调用测试工具 softbus_tool使用说明

softbus_tool 是 OpenHarmony 分布式软总线 API 调用测试工具&#xff0c;文件结构如下图所示。 softbus_tool 能够将软总线 interfaces 目录下的一些常用接口集中起来&#xff0c;供设备间搭建一些场景时使用&#xff08;比如设备绑定、BR 组网&#xff0c;BLE 组网&#xff…

低成本高效益,电子画册才是品牌的重要选择

随着互联网的普及和数字化技术的进步&#xff0c;电子画册已成为许多品牌的重要选择。与传统印刷画册相比&#xff0c;电子画册具有低成本、高效益的优点&#xff0c;成为品牌宣传的新趋势。 具体来说&#xff0c;电子画册可以通过在线平台或移动设备轻松查看&#xff0c;无需额…

【学习】软件测试中为什么要进行接口测试?

接口测试是软件开发过程中不可或缺的一环&#xff0c;它主要是对软件系统中各个模块之间的接口进行测试&#xff0c;以验证它们是否能够正确地交互和协作。接口测试的目的是确保软件系统的各个部分能够无缝地协同工作&#xff0c;从而提高整个系统的质量和稳定性。 一、什么是接…

allegro图片导入及调整的详细方法

目录 1. 图片转换2. 图片导入3. 导入图片调整3.1 图层调整 1. 图片转换 allegro只能导入IPF格式的文件&#xff1a; 正常情况下我们的图片都是JPG、BMP或者其他常见格式&#xff0c;需要将之转换为IPF格式才能导入&#xff0c;这里有工具。 需要工具在此 ->BMP转IPF工具 …