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

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

Python实现阶乘的四种写法

《Python实现阶乘的四种写法》本文主要介绍了Python实现阶乘的六种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录第一种:推导式+循环遍历列表内每个元素相乘第二种:调用functools模块reduce的php累计

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho