【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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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"
    在这里插入图片描述

在这里插入图片描述

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

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

相关文章

JVS-智能BI数据分析:数仓+流程化加工的独特优势

在JVS-BI中采用了数仓流程化加工的方式进行数据分析&#xff0c;主要涉及到数据的离线抽取&#xff0c;流程化加工&#xff0c;生成标准的数据分析结果。 下面我们先看下什么是数仓&#xff1a; 数仓&#xff08;Data Warehouse&#xff09;是一个用于集中存储和管理企业中各种…

iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑)

引言 在 iOS 开发中&#xff0c;将 IPA 文件上传到苹果开发者中心是一个重要的步骤。通常情况下&#xff0c;我们需要使用 Mac 电脑上的 Xcode 或 Application Loader 工具来完成这个任务。然而&#xff0c;如果你没有 Mac 电脑&#xff0c;也没有关系&#xff0c;本文将介绍一…

2024 抖音欢笑中国年(三):编辑器技巧与实践

前言 本次春节活动中&#xff0c;我们大部分场景使用内部的 SAR Creator互动方案来实现。 SAR Creator 是一款基于 TypeScript 的高性能、轻量化的互动解决方案&#xff0c;目前支持了Web和字节内部跨端框架平台&#xff0c;服务于字节内部的各种互动业务&#xff0c;包括但不限…

RabbitMQ的自动应答和手动应答,解决重试死循环

RabbitMQ的自动应答和手动应答&#xff0c;解决重试死循环 1.应答模式 RabbitMQ 中的消息应答模式主要包括两种&#xff1a;自动应答&#xff08;Automatic Acknowledgement&#xff09;和手动应答&#xff08;Manual Acknowledgement&#xff09;。 1、自动应答&#xff1a;…

保研线性代数复习4

一.范数&#xff08;Norms&#xff09; 1.什么是范数&#xff1f; 范数是一个向量空间V的函数&#xff0c;每一个属于向量空间V的向量x都匹配了一个实数&#xff08;它的长度&#xff09;&#xff1a; 2.范数的性质&#xff1f; 齐次性&#xff1a; 正定性&#xff1a; 三…

网络安全之权限维持那点事

权限维持 一旦黑客成功地入侵了目标系统&#xff0c;他们通常会尝试保持对系统的持久访问权&#xff0c;以便继续执行恶意活动&#xff0c;如窃取敏感数据、植入恶意软件、破坏系统功能等。 权限维持的过程可能包括以下几个方面&#xff1a; 后门植入&#xff1a;黑客可能会在…

easyExcel - 动态复杂表头的编写

目录 前言一、情景介绍二、问题分析三、代码实现方式一&#xff1a;head 设置方式二&#xff1a;模板导出方式三&#xff1a;自定义工具类 前言 Java-easyExcel入门教程&#xff1a;https://blog.csdn.net/xhmico/article/details/134714025 之前有介绍过如何使用 easyExcel&…

CSS-浮动文字环绕布局、隐藏属性display、overflow、三角形制作、鼠标样式

文字环绕布局 CSS文字环绕布局是指在网页中让文字环绕在图片或其他元素周围的布局方式。这通常通过CSS中的float属性来实现。你可以将图片设置为float: left;或float: right;&#xff0c;然后在文本元素中使用clear属性来清除浮动&#xff0c;以确保文字不会覆盖图片。另外&am…

Jmeter02-2:参数化组件其他方式

0、Jmeter组件&#xff1a;参数化概述 0.1 是什么&#xff1f; 参数化是动态的获取并设置数据 0.2 为什么&#xff1f; 比如执行批量操作时&#xff0c;批量插入或批量删除&#xff0c;之前数据都是手写的&#xff0c;每执行完都要修改一次&#xff0c;效率太低 而参数化就是…

基于javassmJSP的教学质量评价系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

maxpool long数据类型报错

报错&#xff1a; RuntimeError: “max_pool2d” not implemented for ‘Long’ 源码&#xff1a; import torch from torch import nn from torch.nn import MaxPool2dinput torch.tensor([[1, 2, 0, 3, 1],[0, 1, 2, 3, 1],[1, 2, 1, 0, 0],[5, 2, 3, 1, 1],[2, 1, 0, 1, 1…

重温OKHTTP源码

本文基于OkHttp4.12.0源码分析 官方地址 概括 本篇主要是对okhttp开源库的一个详细解析&#xff0c;包含详细的请求流程分析、各大拦截器的解读等。 使用方法 同步请求&#xff1a;创建一个OKHttpClient对象&#xff0c;一个Request对象&#xff0c;然后利用它们创建一个Ca…

文献速递:深度学习胰腺癌诊断--基于螺旋变换的胰腺癌分割模型驱动深度学习方法

Title 题目 Model-Driven Deep Learning Method forPancreatic Cancer Segmentation Basedon Spiral-Transformation 基于螺旋变换的胰腺癌分割模型驱动深度学习方法 01 文献速递介绍 胰腺癌是最致命的恶性肿瘤之一&#xff0c;其特点是诊断延迟、治疗困难和高死亡率。患者…

采用Flink CDC操作SQL Server数据库获取增量变更数据

采用Flink CDC操作SQL Server数据库获取增量变更数据 Flink CDC 1.12版本引入了对SQL Server的支持&#xff0c;包括SqlServerCatalog和SqlServerTable。在SqlServerCatalog中&#xff0c;你可以根据表名获取对应的字段和字段类型。 SQL Server 2008 开始支持变更数据捕获 (C…

【C语言】简单介绍进制和操作符

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 本文简要介绍进制和操作符&#xff0c;愿能为您提供帮助&#xff01;文章…

论文解读:吴恩达来信AI Agent技巧—利用自我反馈的迭代细化技术

《自我完善&#xff1a;利用自我反馈的迭代细化技术》 https://arxiv.org/pdf/2303.17651.pdf 摘要 Large language models (LLMs) 经常无法在一次尝试中生成最佳输出。受人类在修改书面文本时所表现出的迭代精炼过程的启发&#xff0c; 我们提出了 SELF-REFINE&#xff0c…

R语言绘图 | 散点小提琴图

原文链接&#xff1a;R语言绘图 | 散点小提琴图 本期教程 写在前面 本期的图形来自发表在Nature期刊中的文章&#xff0c;这样的基础图形在日常分析中使用频率较高。 获得本期教程数据及代码&#xff0c;后台回复关键词&#xff1a;20240405 绘图 设置路径 setwd("You…

CSDN 广告太多,停更通知,转移到博客园

文章目录 前言新博客地址 前言 CSDN的广告实在是太多了&#xff0c;我是真的有点忍不了。直接把广告插在我的文章中间。而且我已经懒得找工作了&#xff0c;我当初写CSDN的目的就是为了找工作&#xff0c;有个博客排名。当时经济环境实在是太差了。我也没必要纠结这个2000粉丝…

因为使用ArrayList.removeAll(List list)导致的机器重启

背景 先说一下背景&#xff0c;博主所在的业务组有一个核心系统&#xff0c;需要同步两个不同数据源给过来的数据到redis中&#xff0c;但是每次同步之前需要过滤掉一部分数据&#xff0c;只存储剩下的数据。每次同步的数据与需要过滤掉的数据量级大概在0-100w的数据不等。 由…

快排序解读

排序算法是计算机科学中不可或缺的一部分&#xff0c;它们在各种数据处理场景中发挥着关键作用。在众多排序算法中&#xff0c;快速排序以其高效的性能和简洁的实现成为了许多程序员的首选。今天&#xff0c;我们就来深入剖析快速排序算法&#xff0c;了解其原理、实现方式以及…