Qt信号和信号槽(二)

news2024/12/25 16:00:45

目录

信号槽使用拓展

示例1(一个信号可以对应多个槽函数)(在上篇文章的代码中进行修改):

 示例2(用信号连接信号):

 信号槽的连接方式

示例:

Lambda表达式

语法格式

定义和调用

信号槽使用拓展

一个信号可以连接多个槽函数, 发送一个信号有多个处理动作

        需要写多个connect()连接

        槽函数的执行顺序是随机的,和connect函数的调用顺序没有关系

        信号的接收者可以是一个对象,也可以是多个对象

一个槽函数可以连接多个信号,多个不同的信号,处理动作是相同的

        需要写多个connect()连接

信号可以连接信号

        信号接收者可以不处理接收的信号,而是继续发射新的信号,这相当于传递了数据,并没有对数据进行处理

connect(const QObject *sender, &QObject::signal, 
        const QObject *receiver, &QObject::siganl-new);

信号槽是可以断开的

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

示例1(一个信号可以对应多个槽函数)(在上篇文章的代码中进行修改):

在mainwindow.h中再添加一个槽函数

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "test.h"
#include "test01.h"
#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //添加need按钮的槽函数
    void needSlot();

    void need1Slot();

private:
    Ui::MainWindow *ui;

    Test01* m_whatnd;
    Test* m_need;
};
#endif // MAINWINDOW_HS

到mainwindow.cpp中定义并进行连接

 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_whatnd = new Test01;
    m_need = new Test;
    connect(m_need,&Test::need,m_whatnd,&Test01::what_need);
    connect(m_need,&Test::need,this,&MainWindow::need1Slot);
    connect(ui->need,&QPushButton::clicked,this,&MainWindow::needSlot);

}

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

void MainWindow::needSlot()
{
    //发射自定义信号
    emit m_need->need();

}

void MainWindow::need1Slot()
{
    qDebug()<<"你什么都不需要";
}

运行程序,应用程序输出两条语句:

 示例2(用信号连接信号):

对mainwindow.cpp中的信号连接进行修改

 运行结果和原先一样:

 信号槽的连接方式

Qt5的连接方式

// 语法:
QMetaObject::Connection QObject::connect(
    	const QObject *sender, PointerToMemberFunction signal, 
        const QObject *receiver, PointerToMemberFunction method, 
		Qt::ConnectionType type = Qt::AutoConnection);

// 信号和槽函数也就是第2,4个参数传递的是地址, 编译器在编译过程中会对数据的正确性进行检测
connect(const QObject *sender, &QObject::signal, 
        const QObject *receiver, &QObject::method);

示例:

在test01.h中进行函数重载

 在mainwindow.cpp中做以下修改

 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_whatnd = new Test01;
    m_need = new Test;
    void(Test::*test1)(QString) = &Test::need;
    void(Test::*test2)(QString) = &Test::need;
    void(Test01::*mypoint)(QString) = &Test01::what_need;
    connect(m_need,test2,m_whatnd,mypoint);
    connect(m_need,test2,this,&MainWindow::need1Slot);
    //信号连接信号
    //connect(ui->need,&QPushButton::clicked,m_need,&Test::need);
    connect(ui->need,&QPushButton::clicked,this,&MainWindow::needSlot);

}

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

void MainWindow::needSlot()
{
    //发射自定义信号
    emit m_need->need();
    m_need->need("吃饭");

}

void MainWindow::need1Slot()
{
    qDebug()<<"你什么都不需要";
}

运行结果:

 

 

Lambda表达式

Lambda表达式是 C++ 11 最重要也是最常用的特性之一,是现代编程语言的一个特点,简洁,提高了代码的效率并且可以使程序更加灵活,Qt是完全支持c++语法的, 因此在Qt中也可以使用Lambda表达式。

语法格式

Lambda表达式就是一个匿名函数, 语法格式如下:

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

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

  1. 捕获列表: 捕获一定范围内的变量
    • [] - 不捕捉任何变量
    • [&] - 捕获外部作用域中所有变量, 并作为引用在函数体内使用 (按引用捕获)
    • [=] - 捕获外部作用域中所有变量, 并作为副本在函数体内使用 (按值捕获)
      • 拷贝的副本在匿名函数体内部是只读的
    • [=, &foo] - 按值捕获外部作用域中所有变量, 并按照引用捕获外部变量 foo
    • [bar] - 按值捕获 bar 变量, 同时不捕获其他变量
    • [&bar] - 按引用捕获 bar 变量, 同时不捕获其他变量
    • [this] - 捕获当前类中的this指针
      • 让lambda表达式拥有和当前类成员函数同样的访问权限
      • 如果已经使用了 & 或者 =, 默认添加此选项
  2. 参数列表: 和普通函数的参数列表一样
  3. opt 选项 –> 可以省略
    • mutable: 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
    • exception: 指定函数抛出的异常,如抛出整数类型的异常,可以使用throw();
  4. 返回值类型:
    • 标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略
  5. 函数体:
    • 函数的实现,这部分不能省略,但函数体可以为空。

定义和调用

因为Lambda表达式是一个匿名函数, 因此是没有函数声明的, 直接在程序中进行代码的定义即可, 但是如果只定义匿名函数在程序执行过程中是不会被调用的。

// 匿名函数的定义, 程序执行这个匿名函数是不会被调用的
[](){
    qDebug() << "hello, 我是一个lambda表达式...";
};

// 匿名函数的定义+调用:
int ret = [](int a) -> int
{
    return a+1;
}(100);  // 100是传递给匿名函数的参数

Lambda表达式的捕获列表中也就是 []内部添加不同的关键字, 就可以在函数体中使用外部变量了。

// 在匿名函数外部定义变量
int a=100, b=200, c=300;
// 调用匿名函数
[](){
    // 打印外部变量的值
    qDebug() << "a:" << a << ", b: " << b << ", c:" << c;  // error, 不能使用任何外部变量
}

[&](){
    qDebug() << "hello, 我是一个lambda表达式...";
    qDebug() << "使用引用的方式传递数据: ";
    qDebug() << "a+1:" << a++ << ", b+c= " << b+c;
}();

// 值拷贝的方式使用外部数据
[=](int m, int n)mutable{
    qDebug() << "hello, 我是一个lambda表达式...";
    qDebug() << "使用拷贝的方式传递数据: ";
    // 拷贝的外部数据在函数体内部是只读的, 如果不添加 mutable 关键字是不能修改这些只读数据的值的
    // 添加 mutable 允许修改的数据是拷贝到函数内部的副本, 对外部数据没有影响
    qDebug() << "a+1:" << a++ << ", b+c= " << b+c;
    qDebug() << "m+1: " << ++m << ", n: " << n;
}(1, 2);

总结:文章中主要介绍了Qt中的信号槽, 主要内容包括: 信号槽的拓展Lambda表达式。 

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

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

相关文章

【金融量化】如何筛选基金?

基金的评价与筛选 1 筛选步骤 1.1 股票型基金 &#xff08;1&#xff09;构建备选池 优先考虑股票配置较为稳定的基金&#xff0c;这样才能预估基金未来一段时间的表现&#xff0c;及其对基准股票指数的跟踪情况。因此&#xff0c;首先应该剔除那些仓位变化较大、本身在进行…

[刷题] 删除有序数组中的重复项

系列文章目录 删除有序数组中的重复项 文章目录 系列文章目录在这里插入图片描述 前言1、题目1.2、判题标准1.3、示例 2、解题2.1、双指针正向查找2.1、逆序删除 3、总结 前言 数据结构在程序世界里非常重要&#xff0c;尤其大厂面试是必考项目&#xff0c;今天随机到[删除有…

“三步走”构建全链路数据能力,助力企业全面唤醒数据价值

01 企业数字化转型加速前进&#xff0c;数据价值唤醒仍面临多重挑战 数字经济蓬勃发展时代&#xff0c;数据已成为关键生产要素。随着国家政策对数据要素价值释放的方向引领&#xff0c;数据赋能企业经营决策、业务模式创新的需求不断强化&#xff0c;以及新兴技术工具的有效支…

[LeetCode 1401]圆和矩形是否有重叠

题目描述 给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) &#xff0c;其中 (x1, y1) 是矩形左下角的坐标&#xff0c;而 (x2, y2) 是右上角的坐标。 如果圆和矩形有重叠的部分&#xff0c;请你返回 true &#xff0c;否则返回 f…

音乐格式转换器mp3免费方法?分享四个实用的!

在日常工作和娱乐中&#xff0c;我们经常会遇到并使用MP3这种音频格式。它以小文件尺寸和优秀音质为特点&#xff0c;成为许多音频文件的首选格式。然而&#xff0c;当我们面对其他音频格式时&#xff0c;可能需要进行转换为MP3的操作。因此&#xff0c;接下来我将向您分享4种简…

篇章十一 Vuex

文章目录 一、理解 Vuex1. 是什么2. 什么时候用 二、Vuex 工作原理三、Vuex 环境搭建四、四个 map 方法的使用五、模块化 命名空间 一、理解 Vuex 1. 是什么 Vue 中实现集中式状态&#xff08;数据&#xff09;管理的一个 Vue 插件&#xff0c;对 vue 应用中多个组件的共享状…

蓝牙室内定位|蓝牙信标iBeacon部署原则

室内定位导航给我们的工作生活带来了诸多的便利&#xff0c;越来越多的企业愿意来SKYLAB了解室内定位方案&#xff0c;并根据自己的实际应用需求来选择米级蓝牙室内定位方案和厘米级UWB室内定位方案。今天SKYLAB君就来简单介绍一下蓝牙Beacon室内定位导航方案中Beacon的部署原则…

JAVA基础:线程池的使用

目录 1.概述 2.线程池的优势​​​​​​​ 2.1.线程池为什么使用自定义方式&#xff1f; 2.2.封装的线程池工具类有什么好处&#xff1f; 3.线程池的七大参数 3.线程池的创建 3.1. 固定数量的线程池 3.2. 带缓存的线程池 3.3. 执⾏定时任务 3.4. 定时任务单线程 3.…

掌握唯米系统ChatGPT批量生成文章的操作技巧

以下是重写后的操作步骤&#xff1a; 1. 购买会员并添加个人的ChatGPT密钥&#xff1a; 首先&#xff0c;您需要购买唯米系统的会员&#xff0c;并获得访问ChatGPT的权限。随后&#xff0c;您可以将个人的ChatGPT密钥添加到系统中&#xff0c;以便使用该功能进行自然语言生成和…

Spring Session使用

一.使用场景 前后端不分离的情况下&#xff0c;往登陆页auth.gulimall.com的session中存放一个用户信息&#xff0c;想要在首页gulimall.com中取出该数据并展示出来 GetMapping("/oauth2.0/gitee/success")public String oauth2(RequestParam("code") Str…

组态王与PLC通过RJ45口建立无线以太网通讯

本文以组态王和2台三菱FX5u PLC为例&#xff0c;介绍组态王与多台 PLC的无线以太网通信实现过程。在本方案中采用了三菱PLC无线通讯终端DTD419MB&#xff0c;作为实现无线通讯的硬件设备。 在这一无线以太网通讯系统的搭建中&#xff0c;用户无需更改网络参数和原有程序&#…

Ubuntu的USB相关操作

这里写目录标题 0.信息查看1. 串口设备设置2. 串口调试助手 0.信息查看 指令lsusb输出Bus 004 Device 002: ID 05e3:0620 Genesys Logic, Inc. USB3.2 Hub Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 006: ID 5986:115f Acer, Inc Integ…

佩戴最舒服的蓝牙耳机推荐,好用、佩戴体验很不错的蓝牙耳机分享

​面对市面上不同场景使用、不同类型的蓝牙耳机&#xff0c;我们选购蓝牙耳机时应该如何选&#xff1f;最怕遇到耳机延迟高、不防水防汗、音质表现差以及佩戴体验差的蓝牙耳机&#xff0c;针对这些经常面临的问题&#xff0c;我这次精选了四款市面上热销质量不错的蓝牙耳机分享…

PMP考试经验分享,准备不要超过三个月‼️

因为各种原因&#xff08;拖延、贪玩、上课 哈哈&#xff09; 我是用一个半月时间准备的PMP考试 3A通过 努力➕幸运的结果 资料准备&#xff1a; PMBOK第六版和第七版&#xff08;PMI官方教材&#xff09; 机构的视频材料&#xff08;巩固基础&#xff09; 模拟题库&#…

计算机原理基础一

内存 计算机数据存储&#xff0c;存储数据的基本单位是字节(Byte),常说的大b,1字节等于8位,8个bit(小b)。每个字节都对应一个内存地址&#xff0c;内存地址是从0开始编写的&#xff0c;然后自增排列&#xff0c;类似数组&#xff0c;C当中空类的大小是1个字节&#xff0c;就是…

JUC并发工具类--AQS

JUC并发工具类--AQS 管程 — Java同步的设计思想MESA模型 AQS&#xff08;AbstractQueuedSynchronizer&#xff1a;抽象队列同步器&#xff09;AQS简介AQS核心结构AQS内部维护属性state。state三种访问方式 两种资源访问方式AQS实现时主要实现的方法isHeldExclusively()tryAcqu…

安全应急产业新标兵, 前沿科技保安全

推广行业前沿技术 服务部队练兵备战 助力应急强国建设 科学应急 一馆一园一平台 安全应急项目推荐 海淀区安全应急产品展示交易中心 同赴时代之约&#xff0c;共创美好未来。 指导单位 2023年4月12日上午&#xff0c; “海淀区安全应急产品展示交易中心“揭牌启动仪式在中…

图像噪声和滤波

图像噪声 在图像采集、处理和传输过程中会受到噪声的影响。常见的图像噪声有椒盐噪声、高斯噪声等。 椒盐噪声 椒盐噪声也叫脉冲噪声&#xff0c;在图像中比较常见&#xff0c;表现为随机出现的噪点&#xff0c;比如在明亮区域中出现的黑色像素。参考下图的例子&#xff1a; 高…

【更改python版本】——日常记录

目录索引 卸载旧版本&#xff1a;提示&#xff1a;python launcher&#xff1a; 下载过程&#xff1a;配置pycharm&#xff1a;提示点&#xff1a;python console打不开的问题&#xff1a; 卸载旧版本&#xff1a; 要卸载 Python 3.7.7 在 Windows 上&#xff0c;请按照以下步骤…

接口测试持续集成

目录 一.在Windows系统上部署Jenkins1.下载Jenkins安装包2.启动Tomcat服务3.通过浏览器访问Jenkins 二.管理Jenkins中的插件1.安装插件2.更新插件3.卸载插件 三.创建项目四.配置项目运行频率 一.在Windows系统上部署Jenkins 1.下载Jenkins安装包 进入Jenkins官网&#xff0c;…