Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)
转载地址:
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对其实现的定义:
- bool connect(const QObject *, const char *,
- const QObject *, const char *,
- Qt::ConnectionType);
- bool connect(const QObject *, const QMetaMethod &,
- const QObject *, const QMetaMethod &,
- Qt::ConnectionType);
- bool connect(const QObject *, const char *,
- const char *,
- 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对其实现的定义:
- QMetaObject::Connection connect(const QObject *, const char *,
- const QObject *, const char *,
- Qt::ConnectionType);
- QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
- const QObject *, const QMetaMethod &,
- Qt::ConnectionType);
- QMetaObject::Connection connect(const QObject *, const char *,
- const char *,
- Qt::ConnectionType) const;
- QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
- const QObject *, PointerToMemberFunction,
- Qt::ConnectionType)
- QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
- 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的差异对比)相关推荐
- Qt的信号槽机制介绍
Qt 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 Qt ...
- 学习QT之信号槽机制详解
学习QT之信号槽机制详解 一.Qt信号槽机制 概念:信号槽是Qt框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如:按钮检测到自己被点击了一下,它就会发出一个信号(sig ...
- 【QT|趣谈】最详细的信号槽机制介绍!
用最有趣的方式解释信号槽通讯机制 1 导语:信号槽的前世今生 2 QT的信号槽 2.1什么是信号槽? 2.2 用严谨的语言解释信号槽 3 信号槽实战 3.1 信号槽实例 4 信号槽plus 4.1 L ...
- QT 的信号与槽机制介绍
QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...
- 【转载】QT 的信号与槽机制介绍
QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...
- Hello Qt——Qt信号槽机制源码解析
基于Qt4.8.6版本 一.信号槽机制的原理 1.信号槽简介 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察 ...
- Qt信号槽机制-传递自定义数据类型(qRegisterMetaType)
Qt信号槽机制-传递自定义数据类型qRegisterMetaType 前言 前言 通过Qt内置的数据类型进行信号与槽参数传递很方便:如果是自己定义的类型如果想使用signal/slot来传递的话,则没 ...
- c++实现Qt信号槽机制
信号槽机制的原理 信号槽是观察者模式的一种实现,或者说是一种升华: 一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: 一个槽就是一个观察者,通常就是在被观察的对象发生改变的时候-- ...
- c++模拟qt信号槽机制
qt的信号槽原理:moc元对象编译器翻译头文件成moc文件,实现头文件中的信号的函数体和申明信号.槽的索引,加上一个qt_static_metacall的函数等等,然后在connect中的QObjec ...
最新文章
- 【radar】毫米波雷达-相机-激光雷达融合相关论文汇总(特征融合、RPN融合、弱监督融合、决策融合、深度估计、跟踪)(5)
- 漂亮的HTML表格 - ebirdfighter的日志 - 网易博客
- 11.字典:当索引不好用时
- python编译exe文件太大了_python编译windows下可执行的exe文件
- 遍历opencv中的mat像素的几种方法和概念
- CSS布局(五) 网页布局方式
- python3.5安装scrapy_在Python3.5下安装和测试Scrapy爬网站
- STM32工作笔记0028---上拉电阻,下拉电阻
- hive中如何把13位转化为时间_【hive常用函数一】日期函数
- farm ugly chicken kick(fuck)这个计算机词汇的由来
- linux脚本基础详解
- python 爬虫下载网易歌单歌曲
- 暂时性死区(TDZ)
- c语言快速判断一个数是偶数还是奇数
- 辞职后五险一金怎么办?史上最全处理办法汇总-千氪
- Linux就这个范儿 第13章 打通任督二脉
- ACM-NEFU新生训练2-排序和CMP
- 无法安装64位版本的office解决方案
- 【微信小程序】引入Base64 图标库
- 误删系统rpc服务器不可用,rpc服务器不可用,小编教你rpc服务器不可用怎么办
热门文章
- 2005年度国产空间信息系统软件测评工作圆满结束
- IT大神提升代码效率的秘密,都私藏在这10个神仙软件里
- 有了这个运维方案,让IT信息化人员头疼的系统宕机再也没出现
- “局域网聊天”开始了
- 再论C++之垃圾回收(GC)
- [CB]加快BCB编译速度
- 都说程序员是吃青春饭!
- 第二节:简易安装 和 快速入门Vue.js
- lua软件测试自动化,一种基于Lua脚本的嵌入式软件自动化测试系统及方法专利_专利查询 - 天眼查...
- java技术论坛的毕业设计_基于java的bbs论坛设计,软件毕业设计