【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式
今天是个好日子,嗯。
信号槽机制是Qt的特色功能之一,类似于windows中的消息机制,在不同的类对象间传递消息时我们经常使用信号槽机制,然而很多时候都没有去关注connect()函数到底有几种重载的形式,其中的各项参数都是什么。
如果总是浮于表面,仅仅是满足于功能实现,而不去深究有哪些可能影响程序行为的参数,或者是作为一种GUI开发框架,她实现这种机制的原理是什么的话,一则是可能得不到提高,二则是在面试的时候问及这些问题时往往只能给出一个模糊的答案。
因此,在接下来的几篇文章中,从最常用的connect参数选择上开始,对Qt的信号槽机制及其实现原理做一次比较深入的梳理。
我们最常用的connect()函数的原型之一如下:
QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)
最后的ConnectionType是一个缺省的参数,默认为自动连接方式,我们来看一下这个参数有哪些值:
1. AutoConnection
自动连接,默认值。
If the signal is emitted in the thread which the receiving object has affinity then the behavior is the same as the Direct Connection.
Otherwise, the behavior is the same as the Queued Connection.
如果信号的发送者和信号的接受者的对象同属一个线程,那个工作方式与直连方式相同;否则工作方式与排队方式相同。
2. Direct Connection
直接连接。
The slot is invoked immediately, when the signal is emitted. The slot is executed in the emitter's thread, which is not necessarily the receiver's thread.
当信号发出后,相应的槽函数将立即被调用;
emit语句后的代码将在所有槽函数执行完毕后被执行,信号与槽函数关系类似于函数调用,同步执行。
3. Queued Connection
排队方式连接。
The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.
当信号发出后,排队到信号队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,调用相应的槽函数。
emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕;
此时信号被塞到信号队列里了,信号与槽函数关系类似于消息通信,异步执行。
4. Blocking Queued Connection
阻塞的排队方式。
The slot is invoked as for the Queued Connection, except the current thread blocks until the slot returns.
Using this type to connect objects in the same thread will cause deadlock.
5. Unique Connection
The behavior is the same as the Auto Connection, but the connection is made only if it does not duplicate an existing connection.
Be aware that using direct connections when the sender and receiver live in different threads is unsafe if an event loop is running in the receiver's thread, for the same reason that calling any function on an object living in another thread is unsafe.
即跨线程调用QObject是线程不安全的。
但这个怎么理解呢?
【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式的更多相关文章
- 在Qt Creator 和在 vs2012 里添加信号和槽
原文地址:http://www.cnblogs.com/li-peng/p/3644812.html 作者:李鹏 出处:http://www.cnblogs.com/li-peng/ 本文版权归作者和 ...
- Qt 学习之路:深入 Qt5 信号槽新语法
在前面的章节(信号槽和自定义信号槽)中,我们详细介绍了有关 Qt 5 的信号槽新语法.由于这次改动很大,许多以前看起来不是问题的问题接踵而来,因此,我们用单独的一章重新介绍一些 Qt 5 的信号槽新语 ...
- [转]QT子线程与主线程的信号槽通信-亲测可用!
近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽 ...
- Qt信号和槽连接方式的选择
看了下Qt的帮助文档,发现connect函数最后还有一个缺省参数. connect函数原型是这样的: QMetaObject::Connection QObject::connect(const QO ...
- Qt 5 最新信号和槽连接方式以及Lambda表达式
最近学习Qt,发现新大陆,这里做下记录. 主要内容就是原始Qt4的信号槽连接方式,以及Qt5新版的连接方式,还有件事简单演示一下lambda表达式的使用方式 代码如下 /* * 作者:张建伟 * 时间 ...
- QT+信号和槽函数_自定义槽函数_一个信号对应多个槽函数
以下的代码里面有自定义槽函数的内容,同时也有信号实现的函数: #ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QWidget> #i ...
- 第15.16节 PyQt(Python+Qt)入门学习:PyQt中的信号(signal)和槽(slot)机制以及Designer中的使用
老猿Python博文目录 老猿Python博客地址 一.引言 前面一些章节其实已经在使用信号和槽了,但是作为Qt中最重要的机制也是Qt区别与其他开发平台的重要核心特性,还是非常有必要单独介绍. 二.信 ...
- 【QT】多个槽函数绑定同一个信号的触发顺序
目录 一.Qt 3.0(包含3.0) - Qt 4.5(包含4.5)版本之前 二.Qt 4.6(包含4.6)版本之后 一.Qt 3.0(包含3.0) - Qt 4.5(包含4.5)版本之前 「多个槽函 ...
- Qt信号槽机制理解
1. 信号和槽概述 > 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式(发布-订阅模式).当某个`事件`发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(s ...
随机推荐
- flex布局基础
一.Flex布局是什么? Flex 即:"弹性布局" 任何一个容器都可以指定为Flex布局 .box{ display:flex; } 行内元素也可以使用Flex布局 .box{ ...
- hdu3068 求一个字符串中最长回文字符串的长度 Manacher算法
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- NPOI2.0导出excel之添加样式、边框和表头
//优化后导出excel public System.IO.Stream ExcelStream(string search) // { var orderBusiniss = Containers. ...
- 随性练习:excel中文字和链接存到html文件
这是一个简单的练习,主要是将excel中文字和链接存到html文件中,并且可通过点击文字直通链接 excel格式如下图示,我这里得excel是07版的,所以用到xlrd模块 代码: import xl ...
- 研磨设计模式学习笔记3--适配器模式Adapter
需求:制作一个日志管理系统,分为2个版本,第一版制作一个将日志存在本地文件的管理系统,第二版制作一个存储在数据库的管理系统,同时,第二版兼容第一版. 优点:可以复用现有功能,无需重新开发. 一.第一版 ...
- MySQL三大范式和反范式
1. 第一范式确保数据表中每列(字段)的原子性.如果数据表中每个字段都是不可再分的最小数据单元,则满足第一范式.例如:user用户表,包含字段id,username,password 2. 第二范式在 ...
- 使用Ext 创建树
ext使用的是ext3.4.0版本 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> < ...
- inventor安装错误
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- C# 判断字符串为空(长度为0),或者是null(没有new)
string str = null; if (string.IsNullOrWhiteSpace(str)) { MessageBox.Show("字符串为null"); } ) ...
- MATLAB字符串处理
字符串处理 MATLAB中字符串用单引号 如果字符串中存在单引号,要使用两个单引号. length()元素个数 (1)字符串的执行 格式:eval(s) s表示字符串 abs()和double() ...