Qt 详谈信号与槽(二)

qt之信号与槽的原理 只要问到qt的亮点是什么,不得不说就是信号与槽机制。信号与槽类似观察者模式。 在面向对象的编程中,都会创建很多实例,而每个实例都是独立的,要想每个实例能够协同合作,那么就会需要一种对象间传递消息的机制,在很多框架中都采用回调函数来进行对象间信息传递。 回调函数就是一个函数指针,如果想要一个处理函数通知一些事件,你需要将这个指针传递给处理函数。处理函数在适当时间调用回调函数。MFC就是使用的回调... 阅读详情

目录

1. ⾃定义信号和槽

1.1 基本语法

1.2 带参数的信号和槽

2. 信号与槽的连接⽅式

2.1 ⼀对⼀

2.2 ⼀对多

2.3 多对⼀

3. 信号和槽的其他说明

3.1 信号与槽的断开

3.2 Qt4 版本信号与槽的连接

3.3 使⽤ Lambda 表达式定义槽函数

3.4 信号与槽的优缺点


1. ⾃定义信号和槽

1.1 基本语法

在 Qt 中,允许⾃定义信号的发送⽅以及接收⽅,即可以⾃定义信号函数和槽函数。但是对于⾃定义的信号函数和槽函数有⼀定的书写规范。

1、⾃定义信号函数书写规范

(1)⾃定义信号函数必须写到 "signals" 下;

(2)返回值为 void,只需要声明,不需要实现;

(3)可以有参数,也可以发⽣重载;

2、⾃定义槽函数书写规范

(1)早期的 Qt 版本要求槽函数必须写到 "public slots" 下,但是现在⾼级版本的 Qt 允许写到类的"public" 作⽤域中或者全局下;

(2)返回值为 void,需要声明,也需要实现;

(3)可以有参数,可以发⽣重载;

3、发送信号

使⽤ "emit" 关键字发送信号 。"emit" 是⼀个空的宏。"emit" 其实是可选的,没有什么含义,只是为了提醒开发⼈员。

⽰例1:

1、在 widget.h 中声明⾃定义的信号和槽,如图所⽰;

2、在 widget.cpp 中实现槽函数,并且关联信号和槽

注意:图中的 ① 和 ② 的顺序不能颠倒。
原因是, ⾸先关联信号和槽,⼀旦检测到信号发射之后就会⽴⻢执⾏关联的槽函数。反之,若先发射信号,此时还没有关联槽函数,当信号发射之后槽函数不会响应.

⽰例2:当⽼师说 "上课了",学⽣们就 "回到座位,开始学习"。

1、在源⽂件中新建两个类,⼀个是⽼师类,⼀个是学⽣类;⾸先选中项⽬名称,⿏标右键 -----> "add new..."

点击 "add new..." 之后,出现如下界⾯:

选择 "choose" 出现如下界⾯.

注意:
在 Qt 中新建类时, 要选择新建类的⽗类.
显然,当前项⽬中还没啥类适合做新类的⽗类, 同时新的类也不是⼀个 "窗⼝" 或者 "控件". 这种情况⼀般选择 QObject 作为基类.
这样做的好处是这个新类的对象可以搭配 Qt 的对象树机制. 便于对象的正确释放.

选择 "下⼀步",出现如下界⾯ :

对于 "学⽣类" 以上述同样的⽅式进⾏添加,添加完成之后,项⽬⽬录新增⽂件如下:

在 teacher.h 中声明信号函数:

在 student.h 中声明槽函数:

在 widget.h 中实例化 "⽼师类对象" 和 "学⽣类对象";

在 student.cpp 中实现槽函数:

在 widget.cpp 中连接⾃定义信号和槽;

运⾏结果如下图⽰:

⽰例3:⽼师点击 "按钮" 触发学⽣上课;

运⾏结果如下图⽰:

1.2 带参数的信号和槽

Qt 的信号和槽也⽀持带有参数, 同时也可以⽀持重载.

此处我们要求, 信号函数的参数列表要和对应连接的槽函数参数列表⼀致.

此时信号触发, 调⽤到槽函数的时候, 信号函数中的实参就能够被传递到槽函数的形参当中.

通过这样的机制, 就可以让信号给槽传递数据了.

⽰例1:重载信号槽

(1)在 "widget.h" 头⽂件中声明重载的信号函数以及重载的槽函数;如下图所⽰:

(2)在 "Widget.cpp" ⽂件实现重载槽函数以及连接信号和槽。

注意:在定义函数指针时要指明函数指针的作⽤域。

(3)执⾏结果如下图所⽰:

⽰例2:信号槽参数列表匹配规则

1、在 "widget.h" 头⽂件中声明信号和槽函数;

2、在 "widget.cpp" ⽂件中实现槽函数以及连接信号和槽

其实信号的参数个数可以多于槽函数的参数个数,但是槽的参数个数不能多于信号参数个数.
但是实际开发中最好还是保持参数个数也能匹配⼀致.

⽰例3:

1、在 "widget.h" 头⽂件中声明信号和槽函数;

2、在 "widget.cpp" ⽂件中实现槽函数以及连接信号和槽;

2. 信号与槽的连接⽅式

2.1 ⼀对⼀

主要有两种形式,分别是:⼀个信号连接⼀个槽 和 ⼀个信号连接⼀个信号。

(1)⼀个信号连接⼀个槽

⽰例:

1、在 "widget.h" 中声明信号和槽以及信号发射函数;

2、在 "widget.cpp" 中实现槽函数,信号发射函数以及连接信号和槽;

(2)⼀个信号连接另⼀个信号

⽰例:

在上述⽰例的基础上,在 "widget.cpp" ⽂件中添加如下代码:

2.2 ⼀对多

⼀个信号连接多个槽

⽰例:

(1)在 "widget.h" 头⽂件中声明⼀个信号和三个槽;

(2)在 "widget.cpp" ⽂件中实现槽函数以及连接信号和槽;

2.3 多对⼀

多个信号连接⼀个槽函数

⽰例:

(1)在 "widget.h" 头⽂件中声明两个信号以及⼀个槽;

(2)在 "widget.cpp" ⽂件中实现槽函数以及连接信号和槽;

3. 信号和槽的其他说明

3.1 信号与槽的断开

使⽤ disconnect 即可完成断开.

disconnect 的⽤法和 connect 基本⼀致.

⽰例:

3.2 Qt4 版本信号与槽的连接

Qt4 中的 connect ⽤法和 Qt5 相⽐是更复杂的. 需要搭配 SIGNAL 和 SLOT 宏来完成.

⽽且缺少必要的函数类型的检查. 使代码更容易出错.

⽰例:

(1)在 "widget.h" 头⽂件中声明信号和槽

(2)在 "widget.cpp" ⽂件中实现槽函数以及连接信号与槽;

Qt4 版本信号与槽连接的优缺点:

优点:参数直观;

缺点:参数类型不做检测;

3.3 使⽤ Lambda 表达式定义槽函数

Qt5 在 Qt4 的基础上提⾼了信号与槽的灵活性,允许使⽤任意函数作为槽函数。

但如果想⽅便的编写槽函数,⽐如在编写函数时连函数名都不想定义,则可以通过 Lambda表达式 来达到这个⽬的。

Lambda表达式 是 C++11 增加的特性。C++11 中的 Lambda表达式 ⽤于定义并创建匿名的函数对象,以简化编程⼯作。

Lambda表达式 的语法格式如下:

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

1、局部变量引⼊⽅式 [ ]

[ ] : 标识⼀个 Lambda表达式 的开始。不可省略。

说明:

由于使⽤引⽤⽅式捕获对象会有局部变量释放了⽽Lambda函数还没有被调⽤的情况。如果执⾏Lambda函数,那么引⽤传递⽅式捕获进来的局部变量的值不可预知。所以绝⼤多数场合使⽤的形式为: [=] () { }

早期版本的 Qt,若要使⽤Lambda表达式,要在 ".pro" ⽂件中添加: CONFIG += C++11因为 Lambda表达式 是 C++11 标准提出的。Qt5 以上的版本⽆需⼿动添加,在新建项⽬时会⾃动添加。

3.4 信号与槽的优缺点

优点: 松散耦合

信号发送者不需要知道发出的信号被哪个对象的槽函数接收,槽函数也不需要知道哪些信号关联了⾃⼰,Qt的信号槽机制保证了信号与槽函数的调⽤。⽀持信号槽机制的类或者⽗类必须继承于 QObject类。

缺点: 效率较低

与回调函数相⽐,信号和槽稍微慢⼀些,因为它们提供了更⾼的灵活性,尽管在实际应⽤程序中差别不⼤。通过信号调⽤的槽函数⽐直接调⽤的速度慢约10倍(这是定位信号的接收对象所需的开销;遍历所有关联;编组/解组传递的参数;多线程时,信号可能需要排队),这种调⽤速度对性能要求不是⾮常⾼的场景是可以忽略的,是可以满⾜绝⼤部分场景。

⼀个客⼾端程序中, 最慢的环节往往是 "⼈".
假设本⾝基于回调的⽅式是 10us, 使⽤信号槽的⽅式是 100us. 对于使⽤程序的⼈来说, 是感
知不到的
Qt信号与槽 信号与槽 GUI用户界面中,当用户操作一个窗口部件时,需要其他窗口部件响应,传统方式经常使用callback(回调机制)来实现。所谓回调即事先将函数指针作为参数传递另一个函数,然后在函数处理过程中适当地方调用回调函数回调机制有两个缺陷:类型不安全,不能保证调用函数过程中使用正确的参数;强耦合,处理函数必须知道调用哪个回调函数。Qt的信号与槽机制是类型安全的,松耦合,更灵活,更方便。 信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 阅读详情

相关推荐

Qt信号与槽详述

信号与槽: 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式(发布-订阅模式)。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。 那信号的本.

m0_64647636的博客 1936

Qt5教程: (4) 带参数信号与槽

在subwidget.h中声明一个signal. 和之前的信号函数重名但是有参数: void backSignal(QString); 之后在subwidget.cpp的槽函数sendSignal()中也发送该信号: emit backSignal("子窗口请求返回"); 在mainwidget.h中声明一个槽函数来响应该信号: void logSlot(QSt...

weixin_30646315的博客 1917

睿尔曼超轻量仿人机械臂-ROS第一篇 启动机械臂的Moveit

本文主要讲述了睿尔曼六轴机械臂在ROS中的功能包配置,及如何根据文件启动Moveit做仿真。

realman_Rop的博客 7489

qt, connect参数,Qt::DirectConnection,Qt::QueuedConnection

connect用于连接qt的信号和槽,在qt编程过程中不可或缺。它其实有第五个参数,只是一般使用默认值,在满足某些特殊需求的时候可能需要手动设置。 Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnec

life_is_too_hard的博客 4万+

CC2340R5-OAD升级实战:从配置到调试的全流程解析

本文详细解析CC2340R5芯片的OAD(空中升级)全流程,涵盖环境配置、MCU-BOOT、OAD-BL和OAD-APP程序开发,以及内存布局和调试技巧。通过实战案例展示如何实现蓝牙设备的远程固件升级,提升开发效率和产品可维护性。

silver的专栏 1063

QCM6490平台DDR测试:从QDUTT配置到眼图分析的实战指南

本文详细介绍了QCM6490平台DDR测试的全流程,从QDUTT工具安装配置到眼图分析,提供了实战操作指南和常见问题解决方案。通过具体案例分享,帮助工程师掌握DDR测试技巧,确保内存稳定性,特别适用于物联网和边缘计算设备的开发调试。

weixin_33910191的博客 456

Qt带参数的信号和槽,以及信号与槽的连接方式

Qt5 在 Qt4 的基础上提⾼了信号与槽的灵活性,允许使⽤任意函数作为槽函数。但如果想⽅便的编写槽函数,⽐如在编写函数时连函数名都不想定义,则可以通过 Lambda表达式 来达到这个⽬的。Lambda表达式 是 C++11 增加的特性。C++11 中的 Lambda表达式 ⽤于定义并创建匿名的函数对象,以简化编程⼯作。说明:•由于使⽤引⽤⽅式捕获对象会有局部变量释放了⽽Lambda函数还没有被调⽤的情况。如果执⾏ Lambda函数,那么引⽤传递⽅式捕获进来的局部变量的值不可预知。

2301_79644919的博客 1663

2006NOIP普及组真题 4. 数列

从上述推理中,我们发现要输出的幂次和中的第 N 项(也就是幂次和中的序号N),对应的二进制位数和幂次和对应的二进制位数相同。当 k=3 时,k的幂次为1, 3, 9, 27, 81…,即第0位,第2位均为1,转成 k 进制(k=3)时。,即第2位,第3位均为1,转成 k 进制(k=3)时。转成 k 进制(k=3)时的幂次和为。,即第0位,第1位,第2位均为1,(即第0位,第1位,第2位均为1)N=12时,12的二进制是。(即第0位,第2位均为1)(即第2位,第3位均为1)结论:这道题就变成了。

weixin_40252159的博客 1514

Qt -- 带参数的信号

信号可以重载 这里,重载mySignal这个函数,并带有两个参数。 在subwidget.h中 // signals是Qt中特有的关键字,最终会转化成C++中语法样式。 signals: /* 信号必须有signals关键字来声明 * 信号没有返回值,但可以有参数 * 信号就是函数的声明,只需声明,无需定义 * 使用时:emit mySignal(); * 信号可以重载 */ void mySignal(); void mySigna

xuechanba的博客 6488

使用protege推理小例子---关系链

使用protege推理小例子---关系链关系链推理 SubPropertityChain在Protege中使用关系链推理1、创建Person类2、创建对象关系3、添加实例4、进行推理5、推理结果 关系链推理 SubPropertityChain 关系链简单的说就是将多个关系表达式串联起来,如下图 1-1 图1-1 小明的父亲是大明,大明的父亲是老明。这就是一个由两组关系连接的关系链,根据关系链可以推理出,小明和老明之间的关系是爷孙关系。 在Protege中使用关系链推理 1、创建Person类 在Entit

weixin_45237780的博客 4457

具身智能的边缘计算核心构成方案

摘要: 具身智能(Embodied Intelligence)依赖物理实体与环境交互,而边缘计算(Edge Computing)通过本地化数据处理降低延迟、提升实时性。两者结合的核心方案包含五层架构:传感器层采集环境数据,边缘处理单元执行本地计算,通信模块实现低延迟传输,决策引擎运行轻量AI模型,执行器接口转化动作为物理操作。该方案以“边缘优先”为原则,满足毫秒级响应(如延迟<50ms),同时优化能效(功耗降低30%)和隐私保护。适用于机器人、自动驾驶等场景,通过分层闭环设计确保在资源受限环境中的可靠

老郑的博客 810

【Qt】信号与槽(下)

主要介绍了自定义信号、带参数的信号槽、信号和槽存在的意义等等

dab112的博客 1621

C++ Qt6 qml CMakeLists.txt如何添加qrc文件

本文介绍了在Qt6项目中如何通过CMake管理QML图片资源。相比Qt5的qmake,CMake需要手动创建qrc文件并配置CMakeLists.txt。关键步骤包括:1)创建resources.qrc文件并添加图片资源;2)在CMakeLists.txt中设置CMAKE_AUTORCC为ON开启自动资源处理;3)使用qt_add_resources将qrc文件绑定到项目。配置完成后,可通过"qrc:alias"方式引用资源图片,解决了相对路径管理复杂的问题。

琅嬛福地 1453

QT:信号与槽

当用户点击取消按钮,弹出问题对话框,询问是否要确定退出登录,并提供两个按钮,yes|No,如果用户点击的Yes,则关闭对话框,如果用户点击的No,则继续登录 当用户点击的登录按钮,进行账号和密码的匹配,如果匹配成功,则弹出信息对话框,给出信息为,登录成功,并给出一个确定按钮,当用户点击该按钮后,关闭登录界面,弹出另一个界面 当账号和密码不匹配是,给出错误对话框,给出信息为账号和密码不匹配,是否重新登录,并提供两个按钮 Yes|No,如果用户点击了Yes,则清空密码框后,继续登录。如果用户点击的取消,则关

m0_58572142的博客 2420

【论文精读】《Towards Deep Learning Models Resistant to Adversarial Attacks》

本文探讨了深度学习模型在面对对抗性攻击时的脆弱性,并提出了一种基于鲁棒优化的方法来增强神经网络的对抗鲁棒性。通过鞍点优化框架,作者提供了对抗攻击和防御机制的统一视角,并在MNIST和CIFAR-10数据集上验证了其方法的有效性。对抗训练的核心思想是将对抗样本引入训练过程,使模型能够学习到对抗样本的特征,从而提升其鲁棒性。本文通过鞍点优化框架提出了一种基于鲁棒优化的对抗训练方法,显著提升了深度学习模型的对抗鲁棒性。本文为深度学习模型的对抗鲁棒性研究提供了新的理论和实证支持,同时为未来研究指明了方向。

nmdbbzcl的博客 610

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Qt】信号与槽

Qt 信号与槽

m0_72563041的博客 2209

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Qt学习笔记(二)Qt 信号与槽

在学习 Qt 的过程中,信号与槽是必不可少的部分,也是 Qt 编程的基础,是 Qt 编程的一大创新,这里分一个章节来学习这个 Qt 的信号与槽。信号(Signal)就是在特定情况下被发射的事件,例如 PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的CurrentIndexChanged() 信号。

sincerelover的博客 1563

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Qt中的信号与槽

在Qt中,用户和控件的每次交互过程称为⼀个事件。例如 "用户点击按钮" 是⼀个事件,"用户关闭窗口" 也是⼀个事件。每个事件都会发出⼀个信号,例如用户点击按钮会发出 "按钮被点击" 的信号,用户关闭窗口会发出 "窗口被关闭" 的信号。Qt 中的所有控件都具有接收信号的能力,⼀个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作.例如,按钮所在的窗口接收到"按钮被点击"的信号以后,会做出"关闭自己"的响应动作;

ABWSO的博客 1241

二、QT的信号与槽

在 Qt 中,用户和控件的每次交互过程称为一个事件。比如 “用户点击按钮” 是⼀个事件,“用户关闭窗口” 也是一个事件。每个事件都会发出⼀个信号,例如用户点击按钮会发出 “按钮被点击” 的信号,用户关闭窗口会发出 “窗口被关闭” 的信号。信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时 Qt 对应的窗口类会发出某个信号,以此对用户的操作做出反应。因此,信号的本质就是事件。如:• 按钮单击、双击• 窗口刷新• 鼠标移动、鼠标按下、鼠标释放• 键盘输入。

weixin_54447296的博客 1411

QT信号与槽

在 Qt 中,⽤⼾和控件的每次交互过程称为⼀个事件。⽐如 “⽤⼾点击按钮” 是⼀个事件,“⽤⼾关闭窗⼝” 也是⼀个事件。每个事件都会发出⼀个信号,例如⽤⼾点击按钮会发出 “按钮被点击” 的信号,⽤⼾关闭窗⼝会发出 “窗⼝被关闭” 的信号。Qt 中的所有控件都具有接收信号的能⼒,⼀个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。例如,按钮所在的窗⼝接收到 “按钮被点击” 的信号后,会做出 “关闭⾃⼰” 的响应动作;

qq_68006585的博客 1668

Qt - 信号和槽

所谓的槽(slot)就是一个普通的成员函数。在以前版本的Qt中,槽函数必须放到public slots:中,这个slots是Qt自己扩展的关键及,并不是C++标准中的语法,Qt里广泛使用了元编程技术,qmake构建Qt项目的时候,就会调用专门的扫描器,扫描代码中特定的关键字。(slots这种),基于关键字自动生成一大堆相关的代码。private:btn->setText("按钮");delete ui;

weixin_73888239的博客 1816

QT中的信号与槽

自定义信号与槽在实际工作中使用的最多,其中槽的操作相当于就是写个函数或方法之类的,如:信号部分需要使用emit来发送信号:信号与槽分谨记发送对象是谁、发送的信号是什么、接收信号是谁、接收信号后的动作是什么即可,connect函数是其中的桥梁。

MasterPJ的博客 1225

Qt 详谈信号与槽(一)

摘要:Qt的信号和槽机制是其核心特性之一,用于实现对象间的事件驱动通信。信号由用户操作触发(如按钮点击),槽是对信号响应的函数。通过QObject::connect()函数将信号与槽关联,实现控件间的交互(如点击按钮关闭窗口)。系统信号和槽可通过Qt帮助文档查询,Qt Creator支持可视化生成槽函数代码(遵循on_XXX_SSS命名规则)。该机制底层通过函数调用实现,信号函数只需声明,槽函数需实现。开发者既可依赖IDE自动生成连接,也可显式使用connect确保可靠性。

yuzhaokangcode的博客 946
上一篇: Qt 详谈信号与槽(一)
下一篇: LeetCode 算法题 1~3 题 C++
万我.
博客等级 码龄1年 460粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值