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

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

使用Qt编程QtNetwork无法使用

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com) 另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章: Qt 之 QNetworkAccessManager踏坑记录-CSDN博客 C++ Qt开发:QNetworkAccessManager网络接口组件 阅读目录 1.1 通用API函数

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以

Qt多语种开发教程

Qt作为跨平台的开发工具,早已应用到各行各业的软件开发中。 今天讲讲,Qt开发的正序怎么做多语言开发。就是说,你设置中文,就中文显示;设置英语就英文显示,设置繁体就繁体显示,设置发育就显示法语等。 开发环境(其实多语种这块根环境没太大关系):win10,Qt.5.12.10 一.先用QtCreator创建一个简单的桌面程序 1.工程就随便命名“LanguageTest”,其他默认。 2.在设计师

android两种日志获取log4j

android   log4j 加载日志使用方法; 先上图: 有两种方式: 1:直接使用架包 加载(两个都要使用); 架包:android-logging-log4j-1.0.3.jar 、log4j-1.2.15.jar  (说明:也可以使用架包:log4j-1.2.17.jar)  2:对架包输入日志的二次封装使用; 1:直接使用 log4j 日志框架获取日志信息: A:配置 日志 文

Qt中window frame的影响

window frame 在创建图形化界面的时候,会创建窗口主体,上面会多出一条,周围多次一圈细边,这就叫window frame窗口框架,这是操作系统自带的。 这个对geometry的一些属性有一定影响,主要体现在Qt坐标系体系: 窗口当中包含一个按钮,这个按钮的坐标系是以父元素为参考,那么这个参考是widget本体作为参考,还是window frame作为参考,这两种参考体系都存在

【Qt】定时器事件

定时器事件 在之前学习QTimer中实现了定时器的功能,而在QTimer背后是QTimerEvent定时器事件进行支撑的。在QObject中提供了一个timeEvent这个函数。 startTimer启动定时器killTimer关闭定时器 Qt 中在进⾏窗⼝程序的处理过程中,经常要周期性的执⾏某些操作,或者制作⼀些动画效果,使⽤定 时器就可以实现。所谓定时器就是在间隔⼀定时间后,去执⾏某⼀