Qt 和 Boost关于信号和槽的对比说明
对比
无论是 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关于信号和槽的对比说明的更多相关文章
- 第七章 探秘Qt的核心机制-信号与槽
第七章 探秘Qt的核心机制-信号与槽 注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用 ...
- Qt Quick 事件处理之信号与槽
前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本的语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经能够完毕 ...
- 2.QT-窗口组件(QWidget),QT坐标系统,初探消息处理(信号与槽)
本章主要内容如下: 1) 窗口组件(QWidget) 2) QT坐标系统 3) 消息处理(信号与槽) 窗口组件(QWidget) 介绍 Qt以组件对象的方式构建图形用户界面 Qt中没有父组件的顶级组件 ...
- Qt对象模型之一:信号和槽
一.信号和槽机制概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目 ...
- Qt Quick 事件处理之信号与槽(foruok的博客)
前面两篇文章<QML 语言基础>和<Qt Quick 简单教程>中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简 ...
- Qt 编程指南 3 信号和槽沟通
https://qtguide.ustclug.org/ 1 信号和槽 所谓信号槽,简单来说,就像是插销一样:一个插头和一个插座.怎么说呢?当某种事件发生之后,比如,点击了一下鼠标,或者按了某个按键, ...
- C/C++ -- Gui编程 -- Qt库的使用 -- 信号与槽的关联
Qt信号与槽的三种关联方法:1.设计界面关联,编辑信号/槽,自动关联 2.手动关联(1).头文件中定义槽 -----mywidget.h----- #ifndef MYWIDGET_H #define ...
- Qt Quick中的信号与槽
在QML中,在Qt Quick中,要想妥善地处理各种事件,肯定离不开信号与槽,本博的主要内容就是整理Qt 中的信号与槽的内容. 1. 链接QML类型的已知信号 QML中已有类型定义的信号分为两类:一类 ...
- QT(4)信号与槽
mainWidget.h #ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QWidget> #include <QPushBu ...
随机推荐
- 洛谷P1419寻找段落
题目 单调队列+前缀和 #include <bits/stdc++.h> #define N 101001 using namespace std; int n, s, t; int da ...
- git 常用命令使用,git bash通用命令
git 常用命令 1.强制推送(慎用,除非你认为其他冲突等可以丢弃 或者不是很重要) git push -- force 2.创建文件等小命令 touch a // 创建一个a文件 >> ...
- YII框架的类自动加载机制
YII之所以能实现快速的自动加载类文件,是因为它通过两种途径来实现. 先看文件 vendor\yiisoft\yii2\BaseYii.php 里面的 autoload 方法 public stati ...
- NOIP提高组历年真题题解
2018 铺设道路 差分水题,推一下结论就好了. #include<cstdio> #include<algorithm> using namespace std; ],d[] ...
- avalon.js中使用owl-carousel轮播图
<?php if($banners){?> <div class="ms-controller" ms-controller="bannerShow ...
- C#MD5方法
不同形式,一样结果 /// <summary> /// 获取大写的MD5签名结果 /// </summary> /// <param name="encypSt ...
- 浅谈JSONP 的本质工作原理
json 是一种数据格式jsonp 是一种数据调用的方式. 你可以简单的理解为 带callback的json就是jsonp 话说我们访问一个页面的时候 需要像另一个网站获取部分信息, 这就是所谓的跨域 ...
- Java主流锁
Java主流锁相关知识点概图,为方便预览,将思维导图上传至印象笔记,博客园直接上传图片受限于图片大小. 印象笔记url:https://app.yinxiang.com/shard/s24/nl/27 ...
- 关于JAVA线程池-ThreadPoolExecutor
1. 源码翻译 /* * * * * * * Written by Doug Lea with assistance from members of JCP JSR-166 * Expert Grou ...
- Mac 中使用phpstorm 修改文件提示"only read",只读权限
在终端中执行命令: 给max系统用户liutao赋予整个项目文件权限,即可成功 sudo chown -R liutao /Users/liutao/Desktop/vagrant/newprojec ...