QT信号与槽的连接后槽函数执行方式

2023-11-10

问题

信号与槽是QT特有的一种功能吧,当使用connect函数将一个信号于一个槽函数绑定过后,那么信号当emit后,就会执行与之绑定的槽函数,那么问题来了,这个执行方式是怎样的,是立刻的还是异步的。如果是立刻的就是以中断形式去执行的,异步的也就是通过事件循环方式去执行的。
是以中断形式去执行的?既当信号emit后就立即去执行槽函数,槽函数结束后返回,继续执行emit语句后的语句。
还是以事件循环形式执行的?既当信号emit后,当成一个事件,进入事件队列,经由事件循环,最终去执行。

探索问题

抱着上述问题,我们首先找到connect函数,先看其函数原型(connect函数有重载,我们找个我们最常用的那个),如下:

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, 
const QObject *receiver,const char *method, Qt::ConnectionType type = Qt::AutoConnection)

我们主要看其中connect的参数:
const QObject *sender 发出信号的对象指针
const char *signal 信号指针
const QObject *receiver 接收信号的对象指针
const char *method 待绑定的方法,也就是槽函数
Qt::ConnectionType type = Qt::AutoConnection 连接方式

我们在习惯性用的connect函数一般只设置四个参数,对最后一个参数不进行设置,即一般是下面这种情况:

connect(myButton, SIGNAL(clicked()),
              this, SIGNAL(buttonClicked()));

那么为了要了解执行方式,我们是时候了解下对后一个参数的含义了,经查手册可以看到Qt::ConnectionType可以有以下几种情况:
连接方式
可以看到,一般有五种连接方式,下面结合我使用经验大致解释下:
Qt::AutoConnection:这个是连接方式自动,也就是我们的默认连接方式,它的含义是当发送信号的对象和接收信号的槽函数如果在同一个线程里面就用Qt::DirectConnection,反之就用Qt::QueuedConnection。
Qt::DirectConnection:这个是直接连接,也就是数当信号触发后立即去执行槽函数,即中断方式,只有当槽函数返回才会继续执行emit语句后的语句。注意此种连接方式的槽函数会在发送者线程里面去执行。
Qt::QueuedConnection:这种是队列连接,也就是信号会以一个事件形式进入事件队列,等待执行。注意此种连接方式的槽函数将会在接收者所在的线程中去执行。因为这种方式需要经过一个事件循环,所以可以理解成异步的方式。
Qt::BlockingQueuedConnection和Qt::UniqueConnection:有了上述的理解,这两个应该结合引文就直接可以明白了,我就不解释了,偷个懒。

得到结论

经过上面的分析我们可以知道,一般常用的connect后执行方式有两种方式:
1、中断方式
2、异步方式
中断方式只需要将连接方式换成Qt::DirectConnection就可以了。
异步方式只需要将连接方式换成Qt::QueuedConnection就可以了

验证结论

为验证以上结论我做了简单的测试(关于在不同线程之间我没做,变得也就是槽函数在哪个线程里面执行的而已)。分两步测试验证中断方式和异步方式。

中断方式测试

测试中断方式我们采用如下代码

connect(this,SIGNAL(testsignal()),
            this,SLOT(testslot()),Qt::DirectConnection);
            
void Widget::testslot()
{
    qDebug()<<"testslot";
}

void Widget::on_pushButton_5_clicked()
{
    emit testsignal();
    qDebug()<<"testsignal";
}

按照上面的分析,当采用中断方式连接后,对于上述代码肯定先执行qDebug()<<"testslot"然后在执行qDebug()<<"testsignal"。那么运行程序可以看到以下结论:
结论
结论:采用Qt::DirectConnection链接后的槽函数,将会在emit触发信号后立即去执行对应的槽函数,待槽函数返回后才会继续执行emit语句后的语句。

异步方式测试

我门将connect函数,最后一个参数改成Qt::QueuedConnection进行测试,

connect(this,SIGNAL(testsignal()),
            this,SLOT(testslot()),Qt::QueuedConnection);

那么当我点击按钮时如果是异步方式上述更改后的代码应该是先执行qDebug()<<"testsignal";然后再去执行qDebug()<<"testslot";。那么运行程序可以看到以下结论:
结论
结论:采用Qt::QueuedConnection链接后的槽函数,在emit后会以一个事件形式进入事件队列,等待事件循环时去执行,不影响emit后的语句。因此可以理解为异步的链接。

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

QT信号与槽的连接后槽函数执行方式 的相关文章

  • 使用 QNetworkAccessManager 的 Qt 控制台应用程序

    我正在尝试写一个Qt调用网络服务的应用程序 这是一个控制台应用程序 url 将作为命令行参数传入 我搜索了例如http程序在Qt并找到这个链接 http qt project org doc qt 5 qnetworkaccessmanag
  • 如何为 Windows 安装开源 Qt 库 5 二进制版本

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我
  • Qt 5.3 QPlainTextEdit 更改 QTextCursor 颜色

    我想更改下面的光标颜色QPlainTextEdit小部件 我能够将其宽度设置为6 但我想改变颜色或者它 是否可以 QFontMetrics fm font setCursorWidth fm averageCharWidth setCurs
  • PyQt5 使动态小部件可点击并将参数传递给另一个函数

    我正在尝试制作动态小部件并使它们可点击 通过单击一个小部件 它应该将动态值传递给其他小部件 我尝试过 sender 和其他访问小部件的选项 但没有任何效果 所有小部件都从最后一个小部件发送信息 下面是代码 import sys from P
  • Android 上与 Qt 5.2 的蓝牙通信[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想使用 Qt 框架使我的 Android 设备能够通过蓝牙进行通信 截至今天 Qt 5 2 是最新的 据我所知 尚不支持蓝牙 在本页
  • 仅具有年/月视图的 PyQt 日历

    在 Qt Designer 中 QDateTimeEdit 具有日历视图选项 通过设置显示格式 我只能显示月 年 但是 当用户单击视图时 它会自动显示每日日历 有没有办法让它只显示月 年日历 为了形象地解释一下 Windows 日历具有与
  • 使用 CMake 时出现 Qt moc 错误

    我正在尝试编写一个 OpenCV 应用程序 使用 Qt 创建 GUI 并使用 CMake 生成 makefile 我遇到的问题是 当我尝试执行make命令 我收到错误 该文件是使用 5 2 1 中的 moc 生成的 它不能与此版本的 Qt
  • Qt 文本选择白线和文本宽度

    我想在 QTextEdit 中自定义文本选择 我想要两件事 选择时删除空格 线条 能够选择选择的宽度 或者小部件宽度 或文本宽度 空白 线条 通常 我想要的是 来自 Bear 应用程序 熊文本选择 在使用 QTextEdit 小部件时 我注
  • qtcreator中C++14的编译

    我有一个 qt 项目 其中包含以下部分C 14 最近 我改变了我的 ubuntu 发行版 现在我有 16 04 LTS 并且安装了 Qt Creator 4 02 建于 6 月 13 日 为了启用C 14编译 我放入项目文件中 QMAKE
  • Qt - 如何在保留选中状态的同时禁用 QCheckBox?

    我有一个带有两个复选框的对话框 我们称它们为 A 和 B 当未选中 A 时 B 应该能够根据用户的需要进行切换 当 A 被选中时 B 不应该能够被切换 现在 我的对话框构造函数中有以下内容 connect ui gt A SIGNAL to
  • QNetworkAccessManager 的替代方案

    我正在BB10中绘制地图 地图被划分为图块 开始时 用户给出经度 纬度和缩放级别 地图将显示在该坐标处 我通过使用 QNetworkAccessManager 执行 http 请求来获得单个图块 首先下载 7x5 块 但问题是 当用户开始在
  • 用Qt制作无边框窗口

    我是 Qt C 新手 我下载了最新的 Windows 版本 做了一些教程 非常棒 我看到了 Qt 框架具有的一些样式选项 而且它很棒 但现在我需要构建我的应用程序 其主窗口 形式 是用没有矩形边框 无边框 的图像设计 蒙皮的 我怎样才能用Q
  • 找不到 PySide SVG 图像格式?

    我正在使用 Eclipse 的 PyDev 插件与 Qt 集成 我安装了 PySide 但在使用 SVG 图像格式时遇到问题 我知道当我运行我的应用程序时 格式位于C Python27 Lib site packages PySide pl
  • 超越堆栈采样:C++ 分析器

    黑客的故事 日期是 2010 年 2 月 12 日 圣诞节前的日子已经过去了 作为一名 Windows 程序员 我几乎遇到了一个主要障碍 我一直在使用 AQTime 我尝试过 sleepy shiny very sleepy 就在我们说话的
  • 如何防止 QTableView 项目在双击时被清除

    使用 QAbstractTableModel 将 QTableView 设置为可编辑flag method def flags self index return Qt ItemIsEnabled Qt ItemIsSelectable Q
  • 更改 QGraphicsView 中的光标

    我正在尝试更改 a 的光标QGraphicsView而ScrollHandDrag已开启 但似乎不起作用 如果禁用 我可以更改光标ScrollHandDrag但不是在它处于活动状态时 我不知道我可能做错了什么 下面是重现该问题的代码的一部分
  • 如何在qt中使用QImage和QPainter将两张图像合并为一张? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 您好 我正在开发一个 blackberry10 应用程序 在应用程序内 我有两个图像 我只需要将这两个图像合并为一个图像 Cascades
  • 如何将 qmake 转换为 cmake?

    我有一个 pro我的项目上的文件 但现在我想将其移植到CMakeLists txt文件 我怎样才能做到这一点 QT core QT gui CONFIG c 11 TARGET test CONFIG console CONFIG app
  • 防止 QGraphicsItem 移出 QGraphicsScene

    我有一个场景 其固定尺寸从 0 0 到 481 270 scene gt setSceneRect 0 0 481 270 在里面 我有一个习惯GraphicsItem多亏了旗帜我可以移动它ItemisMovable 但我希望它留在场景中
  • Qt 模型/视图与标准小部件

    我目前正在阅读模型 视图tutorial http qt project org doc qt 4 8 modelview html来自 Qt 但我仍然不确定是否应该为我的 Qt 程序使用模型 视图或小部件 我需要做一个记录器应用程序来监视

随机推荐

  • 大火的AIGC是什么?能用到工作中哪些地方?

    一 AIGC是什么 AIGC 即Artificial Intelligence Generated Content 中文译为人工智能生成内容 简单来说 就是以前本来需要人类用思考和创造力才能完成的工作 现在可以利用人工智能技术来替代我们完成
  • codeblock出现“64位Windows不兼容”问题的解决办法探究

    注 Codeblocks出现该问题暂时还没有根除的解决办法 并且没有明确的解决办法 该篇文章仅提供一些解决问题的思路 原因分析 在网上有不少网友遇见此类问题 但是并没有给出具体的解决方案 但是在解决该问题的案例中 此问题的最大可能原因为 电
  • Java 运算符中 前++ 和后++ 的区别详解

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 一 前 和 后 的区别 具体在代码中给出 Test public void test3 前 先自加1 再运算 int a 10 int
  • 2022-07-14 mysqldump备份和还原数据库

    今天生产环境要将数据库迁移到其它机器上 所以打算用mysqldump进行数据库的备份和还原工作 1 备份 在linux的mysql的bin下执行语句 mysqldump uroot p webdata gt webdata sql 2 还原
  • 两个深度学习模型进行融合Concatenate

    下面是两个深度学习模型的融合代码 具体需要哪两个模型进行融合需要自己替换成相应的模型层 model1 Sequential input model1 add Dense 32 input shape NUM FEAT1 1 model1 a
  • 使用vue-json-viewer实现高亮展示、折叠和复制json数据

    一 安装 npm install vue json viewer save 二 组件引入 import JsonViewer from vue json viewer components JsonViewer 三 使用 参数说明
  • mockmvc模拟Spring Security登录用户

    mockmvc模拟Spring Security登录用户 1 1 准备数据 1 1 1 创建模拟用户 并设置默认用户信息 1 1 2 为 WithMockCustomUser 指定一个 SecurityContextFactory 1 2
  • ThreadPoolExecutor使用示例,请给出详细代码示例

    import java util concurrent Executors import java util concurrent ThreadPoolExecutor import java util concurrent TimeUni
  • 相关系数,互相关函数,协方差,卷积

    X t 为随机过程 a t E X t 为期望 Y t 为另一随机过程 自相关函数的定义为 R s t E X s X t 互相关函数的定义为 R s t E X s Y t 事实上 在图象处理中 自相关和互相关函数的定义如下 设原函数是f
  • CSS滤镜 filter 网站灰色设置

    webkit filter grayscale 100 moz filter grayscale 100 ms filter grayscale 100 o filter grayscale 100 filter grayscale 100
  • 安装虚拟网络服务器,云服务器安装虚拟网络设置方法

    云服务器安装虚拟网络设置方法 内容精选 换一换 通过云服务器或者外部镜像文件创建私有镜像时 如果云服务器或镜像文件所在虚拟机的网络配置是静态IP地址时 您需要修改网卡属性为DHCP 以使私有镜像发放的新云服务器可以动态获取IP地址 不同操作
  • NMAKE程序维护工具

    用法 NMAKE commandfile NMAKE options f makefile x stderrfile macrodefs targets 选项 A 生成所有已计算的目标 B 如果时间戳相等则生成 C 取消输出消息 D 显示生
  • 【2020】奇安信秋招C/C++方向试卷3

    这种试卷根本不会做 老板一共需要给某个员工发奖金n元 可以选择一次发1元 也可以选择一次发2元 也可以选择一次发3元 请问老板给这位员工发放完n元奖金共有多少种不同的方法 数据范围 1 lt n lt 10 class Solution p
  • 【pytorch】固定(freeze)住部分网络

    前言 最好 最高效 最简洁的 是 方案一 方案一 步骤一 固定基本网络 代码模板 获取要固定部分的state dict pre state dict torch load model path map location torch devi
  • 第十四届教育技术与计算机国际会议新增SSCI, ESCI期刊

    第十四届教育技术与计算机国际会议 ICETC 2022 特增SSCI ESCI期刊啦 组委会将从会议录用并注册的文章中遴选优秀文章推荐到以下SSCI ESCI期刊 被选中的文章作者需要在被会议接收的文章基础上增加至少50 的新内容 Adva
  • 机器学习竞赛中取胜

    摘要 本文总结由Marios Michailidis a k a Kazanova Kaggle Grandmaster在2016年3月5日现在排名第3位的在线研讨会上分享的技巧 更好地在机器学习竞赛中取胜 更多深度文章 请关注 https
  • DFS(深度优先遍历)解题思路

    DFS主要可以用于解决三种问题 1 可达性 连通性问题 LeetCode上适用题目 695 查找最大的连通面积 200 矩阵中的连通分量数目 547 好友关系的连通分量数目 130 填充封闭区域 417 能到达的太平洋和大西洋的区域 2 排
  • 字节实习三个月的感受随笔

    我是23届的研究生 双飞本 985硕士 自2022年3月准备春招实习以来 面试了微软 字节 网易 蔚来 美团 拼多多 过了一面放弃 阿里等公司 最终字节 网易和蔚来给了offer 当然 也有京东这种给日常实习的 就不算了 最后选了字节 所以
  • 莱昂哈德·欧拉生平及其成就简介

    莱昂哈德 欧拉 Leonhard Euler 1707年4月15日 1783年9月18日 瑞士数学家 自然科学家 1707年4月15日出生于瑞士的巴塞尔 1783年9月18日于俄国圣彼得堡去世 欧拉出生于牧师家庭 自幼受父亲的影响 13岁时
  • QT信号与槽的连接后槽函数执行方式

    问题 信号与槽是QT特有的一种功能吧 当使用connect函数将一个信号于一个槽函数绑定过后 那么信号当emit后 就会执行与之绑定的槽函数 那么问题来了 这个执行方式是怎样的 是立刻的还是异步的 如果是立刻的就是以中断形式去执行的 异步的