转载地址:

https://blog.csdn.net/nicai888/article/details/51169520

一 闲谈:

熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说:一切皆消息。它可以很方便实现不同窗体之间的通信,然而MFC库将很多底层的消息都屏蔽了,尽管使用户更加方便、简易地处理消息,但也让人特别是没有Win32编程基的人感到迷茫,不是为何,笔者也是深受其害的。

详细描述就不在此展开,感兴趣的请查阅浩瀚如海的资料。。。

二 简要介绍:

基于Qt开发,信号槽是确保正常通信的主要机制,特别是在多线程开发中,线程函数与界面的通信是无法直接进行的,会存在程序崩溃的问题,笔者在实际开发过程中也遇到过此问题,利用Qt的信号槽机制可以避免。

所谓信号槽,类似于设计模式中的观察者模式。当某一事件发生之后,比如,点击了一下PushButton,它就会发出一个信号(signal)。需注意,这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,可以使用连接(connect)函数进行两者之间的关联,即:发送者发送信号(signal),接收者(感兴趣对象)用自己的一个函数(称之为槽(slot))来处理这个信号。同观察者一样,一个signal可以关联(注册)多个slot,当信号发出时,被连接的槽函数会自动被回调。

connect()函数是信号槽机制的关键,下面介绍。

三 connect()函数:

Qt5与Qt4中对connect()函数的实现有所差异。

首先,看Qt4对其实现的定义:

[cpp] view plaincopy
  1. bool connect(const QObject *, const char *,
  2. const QObject *, const char *,
  3. Qt::ConnectionType);
  4. bool connect(const QObject *, const QMetaMethod &,
  5. const QObject *, const QMetaMethod &,
  6. Qt::ConnectionType);
  7. bool connect(const QObject *, const char *,
  8. const char *,
  9. Qt::ConnectionType) const

介绍定义1,参数分别为:发送者sender、信号signal、接收者receiver和槽slot,最后一个基本不用。sender 类型是const QObject *,signal 的类型是const char *,receiver 类型是const QObject *,slot 类型是const char *。这个函数将 signal 和 slot 作为字符串处理。

Qt4使用了SIGNAL和SLOT这两个宏,将信号和槽的函数名转换成了字符串。注意,不能将全局函数或者 Lambda 表达式传入connect()。使用字符串导致了Qt4有以下缺点:一旦出现连接不成功的情况,Qt 4 是没有编译错误的(因为一切都是字符串,编译期是不检查字符串是否匹配),而是在运行时给出错误。这无疑会增加程序的不稳定性。

下面,看Qt5对其实现的定义:

[cpp] view plaincopy
  1. QMetaObject::Connection connect(const QObject *, const char *,
  2. const QObject *, const char *,
  3. Qt::ConnectionType);
  4. QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
  5. const QObject *, const QMetaMethod &,
  6. Qt::ConnectionType);
  7. QMetaObject::Connection connect(const QObject *, const char *,
  8. const char *,
  9. Qt::ConnectionType) const;
  10. QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
  11. const QObject *, PointerToMemberFunction,
  12. Qt::ConnectionType)
  13. QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
  14. Functor);

第一个,sender 类型是const QObject *,signal 的类型是const char *,receiver 类型是const QObject *,slot 类型是const char *。这个函数将 signal 和 slot 作为字符串处理,与Qt4相同,应该是为了兼容性而予以保留的。

第二个,sender 和 receiver 同样是const QObject *,但是 signal 和 slot 都是const QMetaMethod &。我们可以将每个函数看做是QMetaMethod的子类。因此,这种写法可以使用QMetaMethod进行类型比对。

第三个,sender 同样是const QObject *,signal 和 slot 同样是const char *,但是却缺少了 receiver。这个函数其实是将 this 指针作为 receiver,与Qt4相同,应该是为了兼容性而予以保留的。

第四个,sender 和 receiver 也都存在,都是const QObject *,但是 signal 和 slot 类型则是PointerToMemberFunction。看这个名字就应该知道,这是指向成员函数的指针。

第五个,前面两个参数没有什么不同,最后一个参数是Functor类型。这个类型可以接受 static 函数、全局函数以及 Lambda 表达式。

Qt5相比较于Qt4的优势是添加了第4和第5种的重载形式,使得Qt可以在编译期进行错误检查,及早发现问题。

在下一篇文章中将根据实际代码简要介绍信号槽的使用

Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)相关推荐

  1. Qt的信号槽机制介绍

    Qt 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 Qt ...

  2. 学习QT之信号槽机制详解

    学习QT之信号槽机制详解 一.Qt信号槽机制 概念:信号槽是Qt框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如:按钮检测到自己被点击了一下,它就会发出一个信号(sig ...

  3. 【QT|趣谈】最详细的信号槽机制介绍!

    用最有趣的方式解释信号槽通讯机制 1 导语:信号槽的前世今生 2 QT的信号槽 2.1什么是信号槽? 2.2 用严谨的语言解释信号槽 3 信号槽实战 3.1 信号槽实例 4 信号槽plus 4.1 L ...

  4. QT 的信号与槽机制介绍

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  5. 【转载】QT 的信号与槽机制介绍

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  6. Hello Qt——Qt信号槽机制源码解析

    基于Qt4.8.6版本 一.信号槽机制的原理 1.信号槽简介 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察 ...

  7. Qt信号槽机制-传递自定义数据类型(qRegisterMetaType)

    Qt信号槽机制-传递自定义数据类型qRegisterMetaType 前言 前言 通过Qt内置的数据类型进行信号与槽参数传递很方便:如果是自己定义的类型如果想使用signal/slot来传递的话,则没 ...

  8. c++实现Qt信号槽机制

    信号槽机制的原理 信号槽是观察者模式的一种实现,或者说是一种升华: 一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: 一个槽就是一个观察者,通常就是在被观察的对象发生改变的时候-- ...

  9. c++模拟qt信号槽机制

    qt的信号槽原理:moc元对象编译器翻译头文件成moc文件,实现头文件中的信号的函数体和申明信号.槽的索引,加上一个qt_static_metacall的函数等等,然后在connect中的QObjec ...

最新文章

  1. 【radar】毫米波雷达-相机-激光雷达融合相关论文汇总(特征融合、RPN融合、弱监督融合、决策融合、深度估计、跟踪)(5)
  2. 漂亮的HTML表格 - ebirdfighter的日志 - 网易博客
  3. 11.字典:当索引不好用时
  4. python编译exe文件太大了_python编译windows下可执行的exe文件
  5. 遍历opencv中的mat像素的几种方法和概念
  6. CSS布局(五) 网页布局方式
  7. python3.5安装scrapy_在Python3.5下安装和测试Scrapy爬网站
  8. STM32工作笔记0028---上拉电阻,下拉电阻
  9. hive中如何把13位转化为时间_【hive常用函数一】日期函数
  10. farm ugly chicken kick(fuck)这个计算机词汇的由来
  11. linux脚本基础详解
  12. python 爬虫下载网易歌单歌曲
  13. 暂时性死区(TDZ)
  14. c语言快速判断一个数是偶数还是奇数
  15. 辞职后五险一金怎么办?史上最全处理办法汇总-千氪
  16. Linux就这个范儿 第13章 打通任督二脉
  17. ACM-NEFU新生训练2-排序和CMP
  18. 无法安装64位版本的office解决方案
  19. 【微信小程序】引入Base64 图标库
  20. 误删系统rpc服务器不可用,rpc服务器不可用,小编教你rpc服务器不可用怎么办

热门文章

  1. 2005年度国产空间信息系统软件测评工作圆满结束
  2. IT大神提升代码效率的秘密,都私藏在这10个神仙软件里
  3. 有了这个运维方案,让IT信息化人员头疼的系统宕机再也没出现
  4. “局域网聊天”开始了
  5. 再论C++之垃圾回收(GC)
  6. [CB]加快BCB编译速度
  7. 都说程序员是吃青春饭!
  8. 第二节:简易安装 和 快速入门Vue.js
  9. lua软件测试自动化,一种基于Lua脚本的嵌入式软件自动化测试系统及方法专利_专利查询 - 天眼查...
  10. java技术论坛的毕业设计_基于java的bbs论坛设计,软件毕业设计