113.QT中的信号槽

目录

一、信号和槽概述

信号和槽的基本概念:

信号和槽的关系:

二、标准信号槽使用 

三、自定义信号槽的使用 

自定义信号:

自定义槽:

四、Lambda表达式

1.Lambda 表达式不带参数和返回值:

2.Lambda 表达式带参数:

3.Lambda 表达式带参数和返回值:

4.Lambda 表达式带捕获列表:


一、信号和槽概述

信号和槽是Qt框架中一种用于处理事件和实现对象间通信的机制。这种机制使得对象能够在特定事件发生时通知其他对象,并让其他对象能够响应这些事件。

信号和槽的基本概念:

  1. 信号(Signal):

    • 信号是对象发出的通知,表示某个特定事件发生了。信号通常由 emit 关键字发射。
    • 一个信号可以与多个槽关联,多个对象可以连接到同一个信号。
  2. 槽(Slot):

    • 槽是一个特殊的成员函数,用于处理与之关联的信号。槽函数的名称以 on_ 开头是一种常见的命名约定,但并非必须。
    • 槽函数的签名必须与与之关联的信号的签名相匹配。

信号和槽的关系:

        在Qt中信号和槽函数都是独立的个体,本身没有任何联系,但是由于某种特性需求我们可以将二者连接到一起,好比牛郎和织女想要相会必须要有喜鹊为他们搭桥一样。在Qt中我们需要使用QOjbect类中的connect函数进二者的关联。

        信号和槽是Qt框架中一种强大的机制,使得对象能够以灵活而松散耦合的方式进行通信和事件处理。这种机制在Qt应用程序中广泛应用,特别是在用户界面开发和多线程编程中。

连接信号和槽的connect()函数原型如下:

connect(const QObject *sender, &QObject::signal, 
        const QObject *receiver, &QObject::method);


  • sender: 这是发射信号的对象。当 sendermySignal 信号被发射时,与之关联的槽函数将被调用。

  • signal:属于sender对象, 信号是一个函数, 这个参数的类型是函数指针, 信号函数地址

  • receiver: 这是接收信号的对象。当 sender 对象发射 mySignal 信号时,与之连接的 receiver 对象的 mySlot 槽函数将被调用。

  • method: 属于receiver对象, 当检测到sender发出了signal信号,receiver对象调用method方法,信号发出之后的处理动作 

二、标准信号槽使用 

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->closeBut,&QPushButton::clicked,this,&MainWindow::close);
}

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

这段代码是在Qt中使用 connect 函数,将一个按钮的点击事件(clicked信号)与 MainWindow 类的 close 槽函数连接起来。当按钮被点击时,MainWindowclose 槽函数将被调用,关闭主窗口。

connect 函数:

connect(ui->closeBut, &QPushButton::clicked, this, &MainWindow::close);
  • ui->closeBut: 这是一个指向 QPushButton 对象的指针,表示窗口中的一个按钮。
  • &QPushButton::clicked: 这是按钮的 clicked 信号。QPushButton 类的 clicked 信号在按钮被点击时触发。
  • this: 这是当前对象,即 MainWindow 的实例。
  • &MainWindow::close: 这是 MainWindow 类的 close 槽函数。在这里,它与按钮的 clicked 信号关联。

close 槽函数:

void MainWindow::close()
{
    // 槽函数的实现
    QMainWindow::close();  // 关闭主窗口
}
  1. 当按钮被点击时,MainWindow::close 槽函数被调用,关闭主窗口。

总体而言,这段代码建立了一个很简单的连接,使得当按钮被点击时,主窗口将被关闭。

三、自定义信号槽的使用 

自定义信号:

        在Qt中,可以自定义信号和槽,以便在你的应用程序中实现自定义的事件处理机制,同样还是使用connect()对自定义的信号槽进行连接。

        如果想要在QT类中自定义信号槽, 需要满足一些条件, 并且有些事项也需要注意:

  • 要编写新的类并且让其继承Qt的某些标准类
  • 这个新的子类必须从QObject类或者是QObject子类进行派生
  • 在定义类的头文件中加入 Q_OBJECT 宏

        在Qt中信号的本质是事件, 但是在框架中也是以函数的形式存在的, 只不过信号对应的函数只有声明, 没有定义。如果Qt中的标准信号不能满足我们的需求,可以在程序中进行信号的自定义,当自定义信号对应的事件产生之后,认为的将这个信号发射出去即可(其实就是调用一下这个信号函数)。

自定义槽:

       槽函数就是信号的处理动作,在Qt中槽函数可以作为普通的成员函数来使用。如果标准槽函数提供的功能满足不了需求,可以自己定义槽函数进行某些特殊功能的实现。自定义槽函数和自定义的普通函数写法是一样的。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_me=new Me;
    m_girl=new girlfriend;

    // 连接女朋友对象的hungry信号到Me对象的eat槽函数
    connect(m_girl,&girlfriend::hungry,m_me,&Me::eat);

    // 连接女朋友对象的hungry信号到MainWindow对象的eatSlot槽函数
    connect(m_girl,&girlfriend::hungry,this,&MainWindow::eatSlot);

    // 连接按钮的clicked信号到MainWindow对象的hungrySlot槽函数
    connect(ui->hungry,&QPushButton::clicked,this,&MainWindow::hungrySlot);

    // 连接按钮的clicked信号到MainWindow对象的close槽函数
    connect(ui->closeBut,&QPushButton::clicked,this,&MainWindow::close);//通过点击事件 关闭窗口
}

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

void MainWindow::hungrySlot()
{
    //发射自定义信号
    m_girl->hungry();
}

void MainWindow::eatSlot()
{
    qDebug()<<"我带你去吃海鲜...";
}

这个例子创建了一个主窗口,包含两个按钮(ui->hungryui->closeBut)。其中,ui->hungry 按钮模拟女朋友饿了,点击按钮会发射女朋友对象的 hungry 信号。ui->closeBut 按钮用于关闭窗口。

连接的关系如下:

  • ui->hungry 按钮被点击时,会触发 MainWindow::hungrySlot 槽函数,该槽函数通过发射 girlfriend::hungry 信号通知女朋友对象饿了。
  • 女朋友对象的 hungry 信号被连接到两个槽函数:Me::eatMainWindow::eatSlot。这两个槽函数在信号被触发时执行相应的操作。

四、Lambda表达式

 Lambda 表达式是一种在 C++ 中引入的匿名函数的语法糖,它允许在需要函数对象的地方直接定义一个匿名函数,而不必显式地声明一个函数,Qt是完全支持c++语法的, 因此在Qt中也可以使用Lambda表达式。。Lambda 表达式的基本形式如下:

[capture](parameters) -> return_type {
    // 函数体
}

其中:

  • capture:捕获列表,用于指定在 lambda 表达式中可见的外部变量。可以通过值捕获、引用捕获,或者混合捕获。
  • parameters:参数列表,与普通函数的参数列表类似。
  • return_type:返回类型,指定 lambda 表达式的返回类型。
  • 函数体:包含实际代码的部分。

关于Lambda表达式的细节介绍:

1.捕获列表: 捕获一定范围内的变量

  • [] - 不捕捉任何变量
  • [&] - 捕获外部作用域中所有变量, 并作为引用在函数体内使用 (按引用捕获)
  • [=] - 捕获外部作用域中所有变量, 并作为副本在函数体内使用 (按值捕获)
  • 拷贝的副本在匿名函数体内部是只读的
  • [=, &foo] - 按值捕获外部作用域中所有变量, 并按照引用捕获外部变量 foo
  • [bar] - 按值捕获 bar 变量, 同时不捕获其他变量
  • [&bar] - 按引用捕获 bar 变量, 同时不捕获其他变量
  • [this] - 捕获当前类中的this指针
  • 让lambda表达式拥有和当前类成员函数同样的访问权限
  • 如果已经使用了 & 或者 =, 默认添加此选项

2.参数列表: 和普通函数的参数列表一样
3.opt 选项 –> 可以省略

  • mutable: 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
  • exception: 指定函数抛出的异常,如抛出整数类型的异常,可以使用throw();

4.返回值类型:

  • 标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。

5.函数体:

  • 函数的实现,这部分不能省略,但函数体可以为空。

1.Lambda 表达式不带参数和返回值:

[] {
    // 代码块
};

2.Lambda 表达式带参数:

[](int x, int y) {
    return x + y;
};

3.Lambda 表达式带参数和返回值:

[](int x, int y) -> int {
    return x + y;
};

4.Lambda 表达式带捕获列表:

int a = 10;
[](int x) {
    return x + a;
};

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

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

相关文章

GitHub Copilot的使用方法和快捷按键

GitHub Copilot是GitHub与OpenAI合作开发的一款人工智能编码助手。它基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型&#xff0c;可以为你提供代码补全、建议和生成的功能 使用方法&#xff1a; 安装插件&#xff1a; 首先&#xff0c;确保你的开发环…

如何解决NAND系统性能问题?-- NAND接口分类

三、NAND接口 NAND闪存接口是连接主机控制器与NAND存储芯片的通信桥梁&#xff0c;负责命令、地址和数据的传输。典型的NAND闪存接口包括一组I/O线&#xff08;通常为8条或更多&#xff09;用于数据传输&#xff0c;以及若干控制信号线。 基本接口信号&#xff1a; Chip Enable…

一文了解JavaScript的数据类型

在JavaScript中有六种不同的数据类型&#xff0c;六种数据类型又分为5种简单数据类型&#xff08;基本数据类型&#xff09;和1中复杂数据类型&#xff08;引用数据类型&#xff09;&#xff0c;基本数据类型分为&#xff1a;字符串类型&#xff08;string&#xff09;、数值类…

python对自动驾驶进行模拟

使用了 Pygame 库来创建一个简单的游戏环境,模拟了一辆自动驾驶汽车在道路上行驶。汽车的位置和速度通过键盘控制&#xff0c;可以左右移动和加速减速。道路的宽度和颜色可以根据需要进行调整。 import pygame import random # 游戏窗口大小 WINDOW_WIDTH 800 WINDOW_HEIG…

华为路由器OSPF动态链路路由协议配置

R1配置 interface GigabitEthernet0/0/0ip address 10.1.12.1 255.255.255.252 interface LoopBack0ip address 1.1.1.1 255.255.255.255 ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 1.1.1.1 0.0.0.0 network 10.1.12.0 0.0.0.3 R2配置 interface GigabitEthernet0/0/0i…

互联网资讯精选:科技爱好者周刊 | 开源日报 No.145

ruanyf/weekly Stars: 37.4k License: NOASSERTION 记录每周值得分享的科技内容&#xff0c;提供大量就业信息。欢迎投稿、推荐或自荐文章/软件/资源&#xff0c;并可通过多种方式进行搜索。 提供丰富的科技内容每周更新可以提交工作/实习岗位支持投稿和推荐功能 GyulyVGC/…

132基于matlab的采集信号模极大值以及李氏指数计算

基于matlab的采集信号模极大值以及李氏指数计算&#xff0c; 1)计算信号的小波变换。 2)求出模极大曲线。 3)计算其中两个奇异点的Lipschitz指数&#xff0c;程序已调通&#xff0c;可直接运行。 132matlab模极大曲线Lipschitz (xiaohongshu.com)

RTSP协议实现发送ACC音频数据

一.AAC音频格式介绍 AAC音频格式&#xff1a;Advanced Audio Coding&#xff08;高级音频解码&#xff09;&#xff0c;是一种由MPEG—4标准定义的有损音频压缩格式。音频压缩编码的输出码流&#xff0c;以音频帧的形式存在。每个音频帧包含若干个音频采样的压缩数据&#xff0…

C语言--单链表的创建及使用详解

C语言--单链表的创建及使用详解 1. 单链表定义1.1 工作原理1.2 优点 2. 单链表的创建2.1 文件创建2.2 节点创建2.3 链表显示 3. 链表操作3.1 尾插3.2 头插3.3 尾删3.4 头删3.5 指定数据寻找3.6 指定位置前插入3.7 指定位置删除 4. 单链表总内容4.1 test.c文件4.2 SList.h文件4.…

canvas设置圆锥形渐变

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

2024年Flag

管理自己 2024年是一个科技迅速发展的时期&#xff0c;作为一个技术人员&#xff0c;我将有很多事情要做。在这一年里&#xff0c;我计划立下以下几个flag&#xff0c;来提升自己的技术能力。 学习人工智能和机器学习 首先&#xff0c;我计划深入学习人工智能和机器学习。随着…

在线的货币兑换平台源码下载

在线的货币兑换平台&#xff0c;可帮助全球各地的个人和企业将货币从一种货币兑换为另一种货币。该货币兑换平台是 Codecanyon 中最先进的脚本。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88728084

js中try...catch捕捉错误

文章目录 一、前言二、场景2.1、setTimeout2.2、Promise 三、最后 一、前言 说到try...catch都觉得非常熟悉了&#xff0c;不就是用来捕捉代码块中的错误嘛&#xff0c;平时也用得比较多的 二、场景 try...catch只能捕捉到同步执行代码块中的错误 2.1、setTimeout try {setT…

【LabVIEW FPGA入门】没有CompactRIO时进行编程测试

1.新建一个空白项目。 2.新建cRIO终端。 要添加仿真的远程实时目标&#xff0c;请选择项目名称&#xff0c;右击并选择新建>>目标和设备(Targets and Devices)。 3.新建终端和设备&#xff0c;选一个cRIO型号 接下来&#xff0c;当添加目标和设备窗口出现时&#xff0c;请…

第 2 课 ROS 系统安装和环境搭建

第 2 课 ROS 系统安装和环境搭建 1.版本选择 不同的 Ubuntu 安装的 ROS 版本不同&#xff0c;其中 Ubuntu18.04 的 ROS 对应版本为Melodic。 Ubuntu版本ROS版本Ubuntu16.04KineticUbuntu18.04MelodicUbuntu20.04Noetic 2.检查 Ubuntu 的软件和更新源 找到系统中的“软件和…

Python+Django+MySQL的图书馆管理系统【附源码,运行简单】

PythonDjangoMySQL的图书馆管理系统【附源码&#xff0c;运行简单】 总览 1、《图书馆管理系统》1.1 方案设计说明书设计目标需求分析工具列表 2、详细设计2.1 登录2.2 注册2.3 程序主页面2.4 图书新增界面2.5 图书信息修改界面2.6 其他功能贴图 3、下载 总览 自己做的项目&am…

mysql从入门到放弃之数据库体系结构与管理

文章目录 前言一、体系结构1、mysql c/s结构介绍2、mysql实例组成3、mysqld程序运行原理3.1、mysqld守护进程结构3.2、 引入sql语句结构化的查询语言3.3、探索一条SQL语句的执行过程 二、mysql逻辑存储结构三、mysql物理存储结构3.1、innodb存储引擎的段、区、页之间的关系 四、…

YZ虚拟资源下载源码-支持对接公众号-对接支付

这款系统内置的模板是电脑系统下载站的类型&#xff0c;当然你也可以用作其他类型&#xff0c;例如软件下载&#xff0c;其他类型的资源下载&#xff0c;知识付费下载等&#xff0c;改下文字内容即可。 支持商城系统&#xff0c;后台可配置支付。青狐修改增加了很多可用性。 …

C++学习笔记(十九)

一、vector容器 1. vector基本概念 功能&#xff1a;vector数据结构和数组非常相似&#xff0c;也称为单端数组 vector与普通数组区别&#xff1a;不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展 动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff…

VMware 安装及创建一个 CentOS Stream 的详细指南

文章目录 1. 简介2. 下载和安装1&#xff09;通过官网安装2&#xff09;通过电脑管家安装 3. 下载操作系统镜像包4. 创建虚拟机结语 1. 简介 在过去&#xff0c;服务器通常是运行单一操作系统和应用程序的物理设备。这就导致了硬件资源浪费和管理复杂性的增加。为了解决这些问…