当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > Qt5 信号与槽机制的使用

Qt5 信号与槽机制的使用 时间:2018-09-26      来源:未知

Qt作为一种被广泛使用的跨平台的C++图形库而被人们所熟知。Qt使用多种核心机制来实现解决UI编程、软件设计所核心概念。比如在Qt的元对象模型概念的基础之上,实现组件编程技术的对象间通信机制。

一Qt信号与槽的使用

什么是qt的信号?

如果把软件设计中的一个对象或一个模块看做一个组件。那么信号可以看着是组件通知外部组件本身状态的改变。比如按键被点击,此处可以将一个按键看着一个组件,被点击意味着用户点击按键,导致了按键状态变化,而对与我们来说,需要的是按键被点击后需要执行某个动作。信号就是Qt用来通知需要执行的动作方式。

什么是qt的槽?

可以将上例种需要执行的动作称之为槽。可以看出,槽应该是函数(对于C++来说,可以是成员函数、全局函数)。

在Qt中,信号由Qt的元对象系统来实现。只需要声明信号。实际上,信号应该类似函数指针调用的方式。但是qt支持一个信号的发生可以导致任意个槽函数的调用,因此,信号的实现上应该是使用了链表或容器来存储该信号的发生需要调用的相关的槽函数。同时qt提出了关键字emit signals来实现信号。

在此代码中,使用signals声明了一个newPaper信号(信号的实现由qt元对象系统实现)。用来表示有一个新的Paper到来,可以通知对Paper感兴趣的对象执行操作。那么如何通知?使用emit。

在send函数中,表示发射一个信号,那么只要对这个信号感兴趣的槽信号将得到调用。

这是信号的使用。

下面是slots关键字的使用,表示是槽函数。

在此实例中,send函数的调用将导致信号newPaper的产生,那么这个信号如何导致receiveNewsPaper这个对newPaper感兴趣的函数得到执行呢?qt的元对象系统解决这个问题:Qt对象使用connect函数来使信号和槽发生联系——信号的发生导致槽函数得到调用。

图 5

在图5中,代码很直观,两个对象(GuangMingRiBao、 xiaoLiu)以及两个成员函数(NewsPaper::newPaper、 Reader::receiveNewsPaperPrivate)作为connect的参数。表示xiaoLiu关心GuangMingRiBao的newPaper信号。那么只要send函数被调用,那么xiaoLiu的槽函数(receiveNewsPaper)将被调用,从而实现两个对象通信。

在此,两个对象可以看着是两个组件,一个组件发生了状态变化(sned函数的调用)导致该组件对外产生了一个信号通知,因此另一个组件将接受到该信号从而槽函数被调用。

二 Qt5版本中的用法

在Qt5版本之前,信号与槽的机制不能直接使用函数名的形式,而是使用qt提供的SIGNAL和SLOT宏(参考图6),并且由于这种机制只支持qt在运行时(程序运行期间)检查并实现槽函数的调用,因此不能使用编译器在编译期间检查信号与槽函数的参数匹配的问题。因此可能导致由于参数的原因而需要在运行时才能检测到信号与槽的参数不一致问题。

图 6

那么SIGNAL和SLOT的作用是什么?

简单来说,SIGNAL、SLOT是Qt预定义的宏,作用是将其参数变为字符串。即SIGNAL(newPaper(QString))将其变换为字符串“newPaper(QString)”,然后传递给connect。也即是说Qt信号与槽的机制检查是基于名字(字符串的形式)。

另外,在使用函数形式(Qt5版本中)的connect版本时,如果类有重载的成员函数,那么仅仅通过过函数名将导致编译器编译失败——由于有多个重载的函数名。这时,需要进行类型强制性转换来解决问题。

三 总结

在Qt5中,连接对象信号与对象的槽函数可以有两种方式:

1. 早期版本的使用SINGNAL(信号(信号参数))宏和SLOT(槽(槽函数参数));

2. Qt5中的新机制 —— 使用函数地址的形式。使用这种新机制

可以利用编译器在编译过程中来检查信号与槽的参数匹配,同时也可以支持默认参数。

上一篇:Android6.0权限处理机制

下一篇:什么是ViewDragLayout?

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部