对比

无论是 Qt 的实现方式还是 Boost 的实现方式,除了必须的定义信号和槽的类之外,都不需要额外的类。

两种实现都解决了类爆炸的问题。下面让我们对照着来看一下我们前面的分析。

  • 两个不同的术语以及各自的动作:信号和槽

  • 在一个地方(信号)可以连接零个或者多个回调函数(槽)同时也是多对多的,一对多,多对多

  • 焦点在于连接本身,而不是提供者或者消费者;

  • 不需要手工为了一个连接创建新的类

  • 连接仍旧是类型安全的

这五点是信号槽系统的核心,Qt 和 boost 都拥有这些特性。

下面则是二者的不同之处:

Boost.Signals Qt Signals 和 Slots
信号 一个信号就是一个对象
全局的、局部的或者是成员对象
信号只能是成员函数
调用 发出信号类似于函数调用
任何能够访问到信号对象的代码都可以发出信号
发出信号类似于函数调用
Qt 提供了一个 emit 关键字来完成这个操作
只有信号的拥有者才能发出信号
槽是任何可被调用的函数或者函数对象 槽是经过特别设计的成员函数
返回值 可以有返回值?,返回值可以在多个槽中使用 没有返回值
同步异步 同步 同步或(直连)者异步(队列)
线程安全 非线程安全? 线程安全,可以跨线程使用
信号断开 当且仅当槽是可追踪的时候?,槽被销毁时,连接自动断开 槽被销毁时,连接都会自动断开(因为所有槽都是可追踪的)
类型安全 类型安全(编译器检查) 类型安全(运行期检查)
参数列表 参数列表必须完全一致 槽可以忽略信号中多余的参数(信号的参数可以比槽多)
信号、槽可以是模板 信号、槽不能是模板
底层实现 C++ 直接实现 通过由 moc 生成的元对象实现(moc 以及元对象系统都是 C++ 直接实现的)
内省 没有内省机制 可以通过内省发现

可以通过元对象调用

连接可以从资源文件中自动推断出

?都是有疑问的地方。目前还未理解

最重要的是,Qt 的信号槽机制已经深深地植入到框架之中,成为不可分割的一部分。它们可以使用 Qt 专门的开发工具,例如 QtCreator,通过拖拽的方式很轻松的创建、删除、修改。它们甚至可以通过动态加载资源文件,由特定命名的对象自动动态生成。这些都是 boost 作为一个通用库所不可能提供的。

-----------------------------------------------------------------------------------------------------------------------------------

转帖地址:http://no001.blog.51cto.com/1142339/1335733/

Qt 和 Boost关于信号和槽的对比说明的更多相关文章

  1. 第七章 探秘Qt的核心机制-信号与槽

    第七章 探秘Qt的核心机制-信号与槽 注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用 ...

  2. Qt Quick 事件处理之信号与槽

    前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本的语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经能够完毕 ...

  3. 2.QT-窗口组件(QWidget),QT坐标系统,初探消息处理(信号与槽)

    本章主要内容如下: 1) 窗口组件(QWidget) 2) QT坐标系统 3) 消息处理(信号与槽) 窗口组件(QWidget) 介绍 Qt以组件对象的方式构建图形用户界面 Qt中没有父组件的顶级组件 ...

  4. Qt对象模型之一:信号和槽

    一.信号和槽机制概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目 ...

  5. Qt Quick 事件处理之信号与槽(foruok的博客)

    前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简 ...

  6. Qt 编程指南 3 信号和槽沟通

    https://qtguide.ustclug.org/ 1 信号和槽 所谓信号槽,简单来说,就像是插销一样:一个插头和一个插座.怎么说呢?当某种事件发生之后,比如,点击了一下鼠标,或者按了某个按键, ...

  7. C/C++ -- Gui编程 -- Qt库的使用 -- 信号与槽的关联

    Qt信号与槽的三种关联方法:1.设计界面关联,编辑信号/槽,自动关联 2.手动关联(1).头文件中定义槽 -----mywidget.h----- #ifndef MYWIDGET_H #define ...

  8. Qt Quick中的信号与槽

    在QML中,在Qt Quick中,要想妥善地处理各种事件,肯定离不开信号与槽,本博的主要内容就是整理Qt 中的信号与槽的内容. 1. 链接QML类型的已知信号 QML中已有类型定义的信号分为两类:一类 ...

  9. QT(4)信号与槽

    mainWidget.h #ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QWidget> #include <QPushBu ...

随机推荐

  1. CF620E New Year Tree 线段树+dfs序+bitset

    线段树维护 dfs 序是显然的. 暴力建 60 个线段树太慢,于是用 bitset 优化就好了 ~ code: #include <bits/stdc++.h> #define M 63 ...

  2. 爬虫(四):BeautifulSoup库的使用

    一:beautifulsoup简介 beautifulsoup是一个非常强大的工具,爬虫利器. beautifulSoup “美味的汤,绿色的浓汤” 一个灵活又方便的网页解析库,处理高效,支持多种解析 ...

  3. 使用MockMVC与Junit进行单体测试

    1.pom.xml追加 junit spring-test 2.测试共通类 @ContextConfiguration(locations = { "classpath:springfram ...

  4. C语言的历史

    1.ALGOL语言 ALGOL ,为算法语言(ALGOrithmic Language)的缩写,是计算机发展史上首批产生的高级程式语言家族.当时还是晶体管计算机流行的时代,由于ALGOL语句和普通语言 ...

  5. Python网络爬虫学习手记(1)——爬虫基础

    1.爬虫基本概念 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.--------百度百科 简单的说,爬 ...

  6. WindowsForm客户端自动更新逻辑

    启动客户端的时候,单独开一个线程,该线程主要是判断指定服务器上的更新包和本地使用的客户端是否一致,是否需要更新,不需要更新,则退出,需要更新则从服务端的下载更新包,然后提示用户是否更新,点击更新,启动 ...

  7. VM 15 永久激活密钥

      VMware Workstation 15 永久激活密钥   YG5H2-ANZ0H-M8ERY-TXZZZ-YKRV8   UG5J2-0ME12-M89WY-NPWXX-WQH88   UA5 ...

  8. OpenJudge计算概论-骑车与走路

    /*============================================================ 骑车与走路 总时间限制: 1000ms 内存限制: 65536kB 描述 ...

  9. osg qt ifc

    ui_ifcproject_20190702.h #pragma once /************************************************************* ...

  10. MERN——MongoDB && React && Node && Express

    原文链接:Let’s build a full stack MongoDB, React, Node and Express (MERN) app github源码地址:jelorivera08/re ...