#《Qt学习之路》学习之路(1)#Qt5.10软件安装及环境配置->QT信 槽实现方式探究->Qt5信 槽新语法

2018.4.25

最近导师接了一个新项目,需要用到Qt,最近一段时间需要从零学起一个新平台的使用和安装了。

软件安装及环境配置主要参考 Qt5.9.2+VS2015安装配置教程

成功在办公室电脑(WIN10+VS2015+Qt5.10.1)与实验室电脑(WIN7+VS2017+Qt5.10.1)上安装配置成功(貌似匹配有点奇葩,这是历史遗留问题了)。

上大概翻了一些教程,对比一下发现Qt学习之路2的学习推进方式更适合我一些,为了防止自己遗忘,在这里分享一些学习的要点,我记的知识要点可能偏个人一些,大概率思维会比较跳跃,建议参考博主原文和查看官方API理解。

 

Qt经典信 槽使用方式

最重要的连接函数connect(sender, signal, receiver, slot);。其中,第一个是发出信 的对象,第二个是发送对象发出的信 ,第三个是接收信 的对象,第四个是接收对象在接收到信 之后所需要调用的函数。sender 和 receiver 都是QObject指针,signal与slot在使用时最好使用成员函数指针(可以靠编译器帮忙查找函数错误)。当 sender 发出了 signal 信 之后,会自动调用 receiver 的 slot 函数。

 

QT信 槽实现方式探究

只有继承了QObject类的类,才具有使用信 槽的能力。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信 槽,都应该添加Q_OBJECT,且应该放在头文件中。这个宏将由moc做特殊处理展开,将为我们的类提供信 槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。

emit 是 Qt 对 C++ 的扩展,是一个关键字(其实也是一个宏),emit 的含义是发出信 。

自定义信 槽需要注意的事项:
1. 发送者和接收者都需要是QObject的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外);
2. 使用 signals 标记信 函数,信 是一个函数声明,返回 void,不需要实现函数代码;
3. 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;
4. 使用 emit 在恰当的位置发送信 ;
5. 使用QObject::connect()函数连接信 和槽;

6. 相互绑定时防止发生无限循环。

 

Qt5信 槽新语法

1.有重载信 的情况:

若信 有重载,编译器会 出一个错误:由于这个函数(注意,信 实际也是一个普通的函数)有重载,因此不能用一个取址操作符获取其地址。如:

需要用函数指针显式指定某一个信 :

 

2.若槽函数带默认参数:

Qt 允许信 和槽的参数数目不一致:一方面,槽函数的参数数目可以比信 的参数少,信 多给的参数槽函数可以不使用,这是允许的;另一方面,槽函数的参数可以比信 的多,那就是槽函数的参数带有默认值。

但是需要注意的是,若使用函数指针显式指定槽函数,会 错。因为我们不能在函数指针中使用函数参数的默认值。这是 C++ 语言的限制:参数默认值只能使用在直接地函数调用中。当使用函数指针取其地址的时候,默认参数是不可见的!

解决方法有:1.用Qt4的连接语法,2.用Qt5+lambda表达式。


#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年3月20日
下一篇 2018年3月20日

相关推荐