一 闲谈:

熟悉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学习记录--02 Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)的更多相关文章

  1. QT学习之路--深入了解信号槽

    槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用.connect()语句的原型类似于:connect(sender, SIGNAL(signal), receiver, SLOT(slo ...

  2. 【QT学习笔记】二、信号槽和自定义信号槽

    1. 信号槽 int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton button("Qui ...

  3. QT学习记录之理解信号槽机制

    作者:朱金灿 来源:http://blog.csdn.net/clever101 QT的事件机制采用的信号槽机制.所谓信号槽机制,简而言之就是将信号和信号处理函数绑定在一起,比如一个按钮被单击是一个信 ...

  4. VJGUI消息设计-兼谈MFC、QT和信号/槽机制

    星期六下午4点,还在公司加班.终于写完了下周要交工的一个程序. 郁闷,今天这几个小时写了有上千行代码吧?虽然大部分都是Ctrl-C+Ctrl-V,但还是郁闷. 作为一个有10年经验的MFC程序员,郁闷 ...

  5. QT信号槽机制

    信号槽 信号槽是QT中用于对象间通信的一种机制,也是QT的核心机制.在GUI编程中,我们经常需要在改变一个组件的同时,通知另一个组件做出响应.例如: 一开始我们的Find按钮是未激活的,用户输入要查找 ...

  6. C++11实现Qt的信号槽机制

    概述 Qt的信号槽机制是Qt的核心机制,按钮点击的响应.线程间通信等都是通过信号槽来实现的,boost里也有信号槽,但和Qt提供的使用接口很不一样,本文主要是用C++11来实现一个简单的信号槽,该信号 ...

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

      信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗 ...

  8. Qt 的信号与槽机制介绍(10个要注意的问题)

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

  9. Qt开发之信号槽机制

    一.信号槽机制原理 1.如何声明信号槽 Qt头文件中一段的简化版: class Example: public QObject { Q_OBJECT signals: void customSigna ...

随机推荐

  1. 寻找总是出错的R文件

    寻找R文件 相信大家使用Android studio开发APP时最常见的一个问题就是R文件爆红了·· 接下来我们来看看怎么寻找R文件 首先我们得从Android转换成Project. 然后就是依次点击 ...

  2. C++程序设计方法3:强制类型转换

    强制类型转换(显示转换) dynamic_cast<Dst_Type>(Src_var) Src_var必须是引用或者指针类型,Dst_Type类中含有虚函数,否则会有编译错误: 若目标类 ...

  3. springboot从入门到精通

    1:安装iDEa 2:安装jdk1.8 安装软件https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...

  4. unity仿微信飞机大战项目

    开发路线: 1,游戏背景(连续播放) 2,添加主角 3,设置游戏主角的动画 4,添加两种子弹并设置子弹的运动 5,添加三种子弹 设置子弹的自动生成和运动 6,添加两种奖励物品 设置奖励物品的自动生成和 ...

  5. 学习 IOC 设计模式前必读:依赖注入的三种实现

    一直以来就是越难的东西越值钱! 嘿嘿,这篇博文章转载自:http://www.cnblogs.com/liuhaorain/p/3747470.html 摘要 面向对象设计(OOD)有助于我们开发出高 ...

  6. 解压文件出错解决方法(invalid compressed data--format violated)

    解压缩出现这个报错: 1.考虑是否传输过程出错,重新传输试试. 2.使用传输工具时,选择二进制试试. 3.使用传输工具时,选择ASCII试试. 解压缩命令: gzip  -d filename gun ...

  7. js 创建Table,每行3列的方式

    table: <table style="width:100%" id="appDatas"></table> 1. var table ...

  8. poj2229 Sumsets (递推)

    http://poj.org/problem?id=2229 看到题目能感觉到多半是动态规划,但是没有清晰的思路. 打表找规律: #include<cstdio> #include< ...

  9. .Net Core中的通用主机(一)——系统配置

    ASP.NET Core 2.0 中的 WebHost(实现 IWebHost 的基类)是用于为进程提供 HTTP 服务器功能的基础结构项目,例如,如果正在实现 MVC Web 应用或 Web API ...

  10. AndroidStudio中Handler类的内存溢出风险

    package com.test.king.xmlparser; import android.annotation.SuppressLint; import android.app.Activity ...