【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式

2023-10-30

今天是个好日子,嗯。

信号槽机制是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是线程不安全的。

但这个怎么理解呢?

转载于:https://www.cnblogs.com/dengwenwu/p/7117518.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式 的相关文章

  • ES(Elasticsearch)中文检索使用笔记(一)

    1 什么是Elasticsearch 根据官网介绍 https www elastic co cn elasticsearch Elasticsearch 以下简称为ES 主要是一种基于JSON的分布式 高扩展 高实时的搜索与数据分析引擎
  • Qt之页面布局

    QTlayout概述 Qt的布局管理系统提供了强大的机制来自动排列窗口中的所有部件 确保它们有效地使用空间 Qt包含了一组布局管理类 从而在应用程序的用户界面中对部件进行布局 比如QLayout的几个子类 这里将它们称作布局管理器 所有QW

随机推荐

  • 基于SSM+JSP的学生信息管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • 34-鼠标拖拽文件功能

    鼠标拖拽文件功能 直接拖动部分文件或者文件夹到tkinter窗口 实现快速添加文件功能 需要安装windnd库 demo如下 import tkinter as tk import windnd from tkinter messagebo
  • 数据库中系统数据库服务器,sql中什么是系统数据库服务器

    sql中什么是系统数据库服务器 内容精选 换一换 数据复制服务 Data Replication Service 简称DRS 是一种易用 稳定 高效 用于数据库实时迁移和数据库实时同步的云服务 数据复制服务围绕云数据库 降低了数据库之间数据
  • 【C语言】一篇博客带你弄懂最大公约数和最小公倍数

    目录 前言 什么是最大公约数和最小公倍数 最大公约数与最小公倍数的公式 求最大公约数方法 方法一 暴力穷举法 方法二 辗转相除法 方法三 更相减损术 求最小公倍数的方法 方法一 公式法 方法二 暴力穷举法 方法三 叠乘法 最后总结 前言 我
  • go语言基础-----23-----文件解析器goconfig

    1 文件解析器goconfig go的ini配置文件非常简单 看下面代码即可 运行之前需要go get go get github com Unknwon goconfig package main import fmt log githu
  • 基于Unittest框架写的自动化脚本右键运行出现 run “py.test for ...“的解决办法

    一 看图 python脚本都是 unittest 写的 但是 运行的时候没注意是 py test 就运行了 二 网上找了解决办法 说是要修改默认运行方式 进入 File Settings Tools Python Integrated To
  • Git:更改远程仓库指向(五)

    修改已有git仓库的远程仓库指向 git remote set url origin 仓库地址 git remote set url origin git github com test thinkphp git Tips 小程序云开发 中
  • SpringBoot项目部署

    Springboot项目部署有两种方式 分别为 打包为jar war jar包和war包到部署服务器的区别和优缺点 1 部署war包 1 将war包解压 将里面的内容放到服务器项目的目录下 2 重启服务器 启动tomcat的时间会有些长 约
  • QNX系统BSP开发研发与应用,QNX技术解答-项目开发-软件开发

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 目前总结了一些
  • [LeetCode-27]-Remove Element (删除指定元素)

    文章目录 题目相关 Solution 题目相关 题目解读 使用In place 原地算法 从数组中删除指定值的所有元素 并返回删除后的数组长度 原题描述 原题链接 Given an array nums and a value val re
  • python函数式编程——迭代器(2)

    文章目录 前言 一 迭代器 前言 python学习笔记 仅供学习使用 一 迭代器 迭代是访问集合元素的 种 式 迭代器是 个可以记住遍历的位置的对象 迭代器对象从集合的第 个元素开始 访问 直到所有的元素被访问完结束 迭代器只能往前不会后退
  • java 静态变量 静态代码初始化块 构造函数的顺序

    静态变量或静态代码块 先后与代码书写顺序有关 初始化代码块或普通变量 顺序与代码书写顺序有关 构造函数 几大原则 一 静态成员变量 Static 1 静态成员变量为类变量 所有对象共享同一内存空间 2 静态成员变量的声明和定义仅在首次加载类
  • 视频无损放大软件:Topaz Video Enhance AI Mac版(支持m1)

    Topaz Video Enhance AI for Mac是一款专业的AI视频无损放大软件 topaz video enhance ai mac版使用时间信息有效提高视频质量和细节 从而达到最好的视频放大 去隔行 降噪和还原效果 另外to
  • gitlab目录功能结构

    默认安装的gitlab 主要有四个目录 opt gitlab 主目录 etc gitlab 放置配置文件 var opt gitlab 各个组件 var log gitlab 放置日志文件 功能操作 检查gitlab各组件状态 gitlab
  • 浅议代码安全检测

    2017年6月1日 中华人民共和国网络安全法 正式实施 等级保护工作正式入法 等级保护制度已成为新时期国家网络安全的基本国策和基本制度 2019年12月1日 网络安全等级保护条例 正式实施 等保2 0是从 信息安全等级保护制度 到 网络安全
  • 卸载vs2010亲测的一个方法

    最近想把vs2010卸载掉 把方法记录下 供需要的人参考 采用的方法是vs自带的卸载的方法 步骤如下 1 打开 控制面板 点击 卸载程序 在弹出的窗口里面找到vs2010的主程序 如图 2 双击打开后 或是右键弹出 卸载 更改 菜单 进入维
  • windows10环境下用anaconda和VScode配置

    文件下载 最新的Anaconda3 5 1 0 Windows x 64 exe版本中在安装的时候已经打包好了vscode 就是在anaconda3安装完成之后 会提示你是否要安装vscode 然后勾选就可以完成vscode的安装 Anac
  • vue实现消息提示框

    我们常常看到很多vue生态下的ui框架的消息提示框 在页面切换的时候依然停留在页面 我们知道vue这种单页面渐进式框架 所有的操作和元素都是挂载在一个节点上的 当路由变化是整个节点下的dom元素也在重新渲染 若要实现ui框架中的类似的消息提
  • 常用损失函数小结

    一 摘要 本文主要总结一下常见的损失函数 包括 MSE均方误差损失函数 SVM合页损失函数 Cross Entropy交叉熵损失函数 目标检测中常用的Smooth L1损失函数 其中还会涉及到梯度消失 梯度爆炸等问题 ESM均方误差 Sig
  • 【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式

    今天是个好日子 嗯 信号槽机制是Qt的特色功能之一 类似于windows中的消息机制 在不同的类对象间传递消息时我们经常使用信号槽机制 然而很多时候都没有去关注connect 函数到底有几种重载的形式 其中的各项参数都是什么 如果总是浮于表