Qt5 中的 signal/slot 新语法

Qt 5 之前的语法

在 Qt 5 之前,我们需要使用下面的语句来链接 signal 和 slot:

Qt 实际上利用SIGNALSLOT这两个宏,把其后的函数名转换成一个字符串。随后,moc 将会扫描全部文件,将所有的 signal 和 slot 提取出来做成一个映射表。QObject::connect()函数则会从这个映射表里面找到该字符串,从 signal 的名字就可以找到 slot 的名字,因此也就知道了在 signal emit 的时候,该去调用哪一个 slot 函数。

Qt 5 之前的 signal/slot 语法的问题

从上面的解释可以看出,Qt 5 之前版本提供的这种语法其实有一些问题:

  • 没有编译期检查:因为函数名被处理成字符串,所有的检查都是在运行时完成的。这就是为什么有时会发生编译通过了,但 slot 并没有被调用。此时,你就应该去检查 console 的输出,看看有没有什么 warning 说明 connect 并没有成功。
  • 因为处理的是字符串,所以 slot 中的类型名字必须用 signal 的完全一致,而且在头文件中的和实际 connect 语句中的也必须一致。也就是说,如果你使用了 typedef 或者 namespace,connect 就可能不成功(在 Qt 5 之前的版本中,我们当然也可以使用 namespace,但是必须保证头文件中的和 connect 语句中的文本完全一致)。

新语法:使用函数指针

在 Qt5 提供了一套新的语法。之前的语法依然可以使用,但是现在,我们有了更好的选择:

这个看起来和之前的版本很类似,因此很容易迁移到新的语法。下面我们看看新语法有什么好处:

编译器检查

如果把 signal 或者 slot 名字编写错误,或者 slot 的参数同 signal 不一致,你会在编译期就获得一个错误。这肯定会在重构、或者修改 signal 或 slot 的名字时节省很多时间。

另一个影响是,Qt 可以利用static_cast返回更友好的错误信息。例如,如果我们少了Q_OBJECT宏,则会有:

其错误信息是:

参数的自动类型转换

现在,我们不仅可以更好地使用 typedef 或 namespace,而且可以利用隐式类型转换。在下面的例子中,我们的 signal 有一个QString参数,而 slot 需要的是QVariant。在新语法中,QString将被自动转换成QVariant

连接到任意函数

如果你留心上面的例子,就会发现,我们的 signal 被连接到了一个 public 函数,但这个函数并不是 slot。Qt 的新语法通过函数指针直接调用函数,而不需要 moc 的特殊处理(但是 signal 依然需要)。

更进一步,我们可以将 signal 连接到任意函数:

这样处理,就可以让你很方便的同 boost 或者 tr1::bind 这样的第三方库协作。

C++11 lambda 表达式

至此之前,我们所有的示例都是基于 C++98. 标准的。但是,如果你的编译器支持 C++11,我相信你一看到“函数指针”这几个字,就一定会想到 C++11 的新特性:Lambda 表达式。现在,Lambda 表达式至少被 MSVC 2010,GCC 4.5,clang 3.1 这几个编译器支持。不过对于后面两个编译器,你需要在编译时加上 -std=c++0x 参数。

现在我们可以用 Lambda 表达式重写了:

这种语法允许我们更方便地编写异步代码。

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

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

相关文章

模拟电子技术基础笔记

模拟电子技术基础笔记 二极管的特性 1 单向导电性(小写是交流,大写是直流) 二极管的应用 1、整流二极管 利用二极管单向导电性,可以把方向交替变化的交流电变换成单一方向的脉动直流电。 2、开关元件 二极管在正向电压作用下电阻…

国家标准GB7665-87传感器

传感器的定义“能感受规定的被测量并按照一定的规律转换成可用信号的器件或装置,通常由敏感元件和转换元件组成”。 传感器是一种检测装置,能感受到被测量的信息,并能将检测感受到的信息,按一定规律变换成为电信号或其他所需形式的…

simulink简介

simulink简介 simulink是基于matlab的框图设计环境,可以用来对各种动态系统进行建模、分析和仿真,它的应用领域十分广泛,任何能用数学模型来描述的系统都可以在simulink中进行仿真分析,如:空气动力学、导航制导、通讯、电子、机械…

商务英语老师给的6个建议

作为学了多年学习英语,应该做这些研读两套英语教材(大学英语剑桥商务英语)读两本小薄本(两个英语原著)独立看两部英语原版电影学习一个国外的语言文化,至少会唱两首英文歌(圣诞歌会唱&#xff0…

C++ 11 在 Qt 5 中的应用

C 11 现在已经是 C 标准,也就没有理由不在新的应用中使用。Qt 4.8 是第一个支持 C 11 特性的 Qt 版本,不过这里,我们首先介绍的是,Qt 5 中如何结合使用 C 11。至于 Qt 4.8,我们会在后续文章中进行阐述。 显而易见的是&…

多媒体表示、描述、编码以及通信的相关规定和标准课程总结

时间:2016.10.11-2016. 11.3注意关注会议机构ITU(国际电信联盟) MPEG: Moving Picture Experts Group,动态图像专家组, 是ISO(International Standardization Organization,国际标准化组织&…

建模与仿真的流程

建模与仿真的流程 以例子为例 第一步:建立模型,列出输出表达式 第二步:解出输出方程 可以参考:解单位冲激 第三步:在simulink中建立仿真图 ctrlr:表示旋转90 按住ctrl可以引出多条线 点击保存&…

AD制图相关问题总结

AD制图总体步骤新建一个工程文件File ->New->Project->PCB.Project->save新建原理图在此工程目录下新建原理图与PCB并保存 File ->New->Schematic->save生成PCB(前提是原理图已完成且没有错误)File->New-> PCB->save&…

vcs 入门

synopsys vcs 软件是仿真和验证的软件,必须掌握。 vcs 即 verilog compile simulator 支持 verilog, systemVerilog, openvera, systemC等语言,同时也有代码覆盖率检测等功能。 可以合第三方软件集合使用,例如 Vera , Debussy ,S…

输入输出及子模块

输入输出及子模块 常用模块库 1 事先规划好功能子系统 2 建立好系统后对系统进行功能划分 在进行动态系统的建模过程中,可以根据需要将模型中比较复杂,或者共同完成某一功能的基本模块(低一层次的子系统)封装起来,并…

使用Hexo搭建博客步骤详解

简介hexo —— 简单、快速、强大的Node.js静态博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 特性风一般的速度Hexo基于Node.js,支持多进程,几百篇文章…

32个最热CPLD-FPGA论坛

1. OPENCORES.ORG 这里提供非常多,非常好的PLD了内核,8051内核就可以在里面找到。进入后,选择project或者由http//www.opencores.org/browse.cgi/by_category进入。对于想了解这个行业动态人可以看看它的投票调查。http://www.opencores.org/…

师兄师姐就业分享会

华为算法工程师自我定位(找一个岗位,好好准备); 来自当年带我走上这条路的学长 。算法工程师对学术要求比较高,发过高水平论文优势很大 通常是月薪14k以上,年薪20万以上,只是一个概数,具体薪资详…

简单模块说明

接地模块(Ground)和终端模块(Terminator) 进入接地模块的帮助系统 右击选择帮助 接地模块表示:输入模块中没有值的部分 Ground 模块连接到其输入端口不连接到其他模块的模块。如果您使用具有未连接的输入端口的模块运…

毫米波雷达和车联网在未来无人驾驶中的应用和比较

来源:来自新加坡南阳理工大学电气与电子信息工程学院的陆亿泷教授,研究领域包括雷达、天线、微波工程、阵列信号处理、电磁计算、复杂问题的遗传算法优化等。会议时间:2017年8月9日 恩智浦恩智浦 半导体(NASDAQ:NXPI)致力于通过安全连接及基础…

机器学习总结

转摘的,忘记连接了朴素贝叶斯 P(A∩B)P(A)*P(B|A)P(B)*P(A|B) 所以有:P(A|B)P(B|A)*P(A)/P(B) 对于给出的待分类项,求解在此项出现的条件下各个目标类别出现的概率,哪个最大,就认为此待分类项属于哪个类别 工作原理 假…

贷款时,如何评估借款人的还款意愿

贷款有一个公式:正常还款还款能力还款意愿。也就是说借款人能不能正常还款,除了借款人的还款能力之外,借款人的还款意愿也有着至关重要的作用。因此贷款审核过程中,对借款人还款意愿的审核是很重要的一个环节,那信贷员…

FPGA时序分析和约束实例

FPGA时序分析和约束实例

数据库设计笔记——概述(一)

数据库数据库(DataBase,DB)是长期存储在计算机内,有组织的,可共享的数据集合。是存放数据的仓库,并且有组织,有管理。数据库管理系统数据库管理系统(Database Management System&…

你应该知道的浮点数基础知识

本文从一个有趣而又令人意外的实验展开,介绍一些关于浮点数你应该知道的基础知识 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢钧轶(cenalulu) 本文原文地址:http://cenalulu.github.io/linux/about…