对比

无论是 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. Neo4j 快速清除数据库数据

    在开发过程中,很多时候需要快(简)速(单)清(粗)除(暴)Neo4j中存在的海量数据节点和关系数据.在这种情况下,delete和detach从性能上都已力不从心.Neo4j官方推荐清库方法,即删除gr ...

  2. mysql的存储引擎与锁

    一.背景知识 1.锁是计算机协调多个进程或线程并发访问某一资源的机制. A.锁分类. | 共享锁(读锁):在锁定期间,多个用户可以读取同一个资源,读取过程中数据不会发生变化. | 排他锁(写锁):在锁 ...

  3. 我需要关于fixedFluxPressure边界的解释【翻译】

    翻译自:CFD-online 帖子地址:http://www.cfd-online.com/Forums/openfoam-solving/82581-i-need-explanations-abou ...

  4. Jenkins 更新 jenkins.war的方法

    Jenkins 有时候更新,直接是主页提示下载 jenkins.war只需要把下载的jenkins.war 替换原来的jenkins.war 就可以了那么问题来了? 原来的 jenkins.war 到 ...

  5. 面试题集锦---BY算法导论小组

    3.7题 3.21题 1.给定能随机生成整数 1 到 5 的函数,写出能随机生成整数 1 到 7 的函数. 提示:两个random就可以有25种可能,每种可能都是等概率的 2.判断一个自然数是否是某个 ...

  6. CSRF in asp.net mvc and ap.net core

    如果在方法上添加了[ValidateAntiForgeryToken],没处理好 请求没有带参数 2019-09-17 14:02:45,142 ERROR [36]: System.Web.Mvc. ...

  7. OpenJudge计算概论-大象喝水

    /*========================================================= 大象喝水 总时间限制: 1000ms 内存限制: 65536kB 描述 一只大象 ...

  8. LC 450. Delete Node in a BST

    Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...

  9. pve_ceph问题汇总

    在同一个网络内,建立了两个同名的群集 Jun 24 11:56:08 cu-pve05 kyc_zabbix_ceph[2419970]: ]} Jun 24 11:56:08 cu-pve05 co ...

  10. lua 求table长度和判断空

    local table_a = {} 判断一:(错误方法)     if table_a == {} then         --你会发现你怎么也进不来 条件判断始终返回false,为什么会这样呢? ...