Qt信号槽的两种写法

2024-08-27 04:18
文章标签 qt 写法 两种 信号

本文主要是介绍Qt信号槽的两种写法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Qt信号槽connect是什么?

  • connect()函数的形式
connect(sender, signal, receiver, slot,type);
  • 参数示意
  1. sender:发出信号的对象
  2. signal:发送对象发出的信号
  3. receiver:要接收信号的对象
  4. slot:接收对象收到信号后调用的函数
  5. type:连接方式,默认自动auto,可设置成同步Driect或异步Quence等方式,可参考品前文

传统Qt4写法(极度不推荐)

 connect(btn_close, SIGNAL(clicked()), this, SLOT(DoCloseSlot()));

不推荐的原因:

  • SIGNAL和SLOT两个宏是将函数名称,转换成了字符串,connect连接不成功,不会在编译时后报错,排查问题困难
  • 槽函数必须定义在slot宏下
public:void DoCloseSlot();//错误,连接失败,没有注册元对象
public slot:void DoCloseSlot();//成功
  • 槽函数在slot下,但参数不匹配,仍然连接失败,无法编译时报错
//xxx.h
signals:void testMocSignal(int input,int in2);
protected slots:void DoCloseSlot(QString a,QString b);
//xxx.cpp
connect(this, SIGNAL(testMocSignal(int,int)), this, SLOT(DoCloseSlot(QString,QString)));
//编译时不报错,运行时输出:/*
QObject::connect: Incompatible sender/receiver argumentsTestMoc::testMocSignal(int,int) --> TestMoc::DoCloseSlot(QString,QString)
*/

但下面这种情况可以响应槽函数

//xxx.h
signals:void testMocSignal(int in1,int in2);void testMocSignal2();void testMocSignal3(int in1);
protected slots:void DoCloseSlot();void DoCloseSlot2(int in1,int in2);void DoCloseSlot3(int in1,int in2=999);void DoCloseSlot4(int in1=999,int in2=999);
//xxx.cpp //可以正常响应,连接成功
connect(this, SIGNAL(testMocSignal(int,int)), this, SLOT(DoCloseSlot()));
//无法响应,连接失败
connect(this, SIGNAL(testMocSignal2()), this, SLOT(DoCloseSlot2(int,int)));
//可以正常响应,连接成功,槽函数缺省值有默认参数
connect(this, SIGNAL(testMocSignal3(int)), this, SLOT(DoCloseSlot3(int)));
//无法响应,连接失败,无法找到匹配的testMocSignal3信号
connect(this, SIGNAL(testMocSignal3()), this, SLOT(DoCloseSlot4()));
/*
DoCloseSlot 可以正常响应,反之却不可以;
最简单的理解,因为调用槽函数的参数缺一不可
*/

综上所述: Qt4的连接方式最大的缺点就是编译时无法报错,在运行期间才会验证是否正确,这对于C++ 这种静态语言,简直就是毁灭

Qt5 仿函数写法(强推,务必)

signals:void testMocSignal(int in1,int in2);void testMocSignal2();void testMocSignal3(QString str);
protected slots:void DoCloseSlot(int in1,int in2);
protect:void DoCloseSlot2();void DoCloseSlot3(int in);
//连接成功
connect(this, &TestMoc::testMocSignal, this, &TestMoc::DoCloseSlot);
//连接失败,参数个数不匹配
connect(this, &TestMoc::testMocSignal2, this, &TestMoc::DoCloseSlot);
//连接失败,参数类型不匹配
connect(this, &TestMoc::testMocSignal3, this, &TestMoc::DoCloseSlot3);
//连接失败,参数个数不匹配
connect(this, &TestMoc::testMocSignal, this, [this](){qDebug()<< __FUNCTION__ ;
});
//连接成功
connect(this, &TestMoc::testMocSignal, this, [this](int in1,int in2){qDebug()<< __FUNCTION__ << in1 << in2;
});
//连接成功,带有默认参数
connect(this, &TestMoc::testMocSignal, this, [this](int in1, int in2,int in3=999) {qDebug() << __FUNCTION__<<in1<<in2<<in3;
});

直接摆优点:

  • 严格的信号槽参数匹配校验,可以在编译期就避免很多问题
  • 槽函数不在限定必须是slot,可以是普通函数,类成员函数,甚至是lambda表达式

这篇关于Qt信号槽的两种写法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110608

相关文章

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要