QT学习—五种直接连接信号槽的连接方式

2023-11-11

一、信号与槽机制

        特别鸣谢B站大轮明王讲Qt的讲解:大轮明王讲Qt的个人空间_哔哩哔哩_bilibili

信号与槽机制(Signal and Slot)是一种在软件开发中广泛使用的通信机制,主要用于处理事件驱动的程序设计。它是Qt框架中的一项重要特性,也被其他编程框架和库所采用。

信号(Signal)是对象发出的事件或状态的通知,它可以被其他对象接收并作出响应。槽(Slot)是处理信号的特定函数或方法。当信号发出时,与之关联的槽函数将被自动调用。信号和槽之间通过连接(Connection)建立联系。

使用信号与槽机制,可以实现对象之间的松散耦合。一个对象可以将自己的信号与其他对象的槽函数进行连接,使得事件发生时能够自动触发相应的响应处理。这种机制使得程序的编写更加灵活和可维护,因为对象之间的交互不需要显式的调用。

二、信号与槽直接连接

        直接连接(Direct Connection)是一种信号与槽之间的连接方式。在直接连接中,当信号发出时,槽函数会立即执行,不经过事件队列的处理,是一种同步的连接方式。直接连接适用情况:

1、函数和槽在同一个线程中.

2、函数和槽函数的执行时间较短,可以立即处理。

连接方式:

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()), Qt::DirectConnection);

其中sender表示信号的发送者,signal表示发送的信号,receiver表示信号的接收者,slot表示执行的槽函数。

2.1、QT4中SIGNAL和SLOT包裹连接

        在QT中支持connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));这样的连接方式,但这样的连接方式存在一定的缺点:使用这种方式时,编译器不会做错误检查,即使函数名或者参数写错了,也能够编译通过,将问题留在了运行的时候,无法尽早发现问题。

//1、使用QT4 SIGNAL/SLOT连接
    connect(ui->btnSignalandSlot,SIGNAL(clicked()),this,SLOT(showMaximized()));

这里在引入了按钮btnSignalandSlot,发送按键按下事件,执行槽函数对MainWindow窗口的最大化显示。

2.2、QT5中使用函数地址进行连接

        这种方式中函数和槽都是用地址的形式进行连接

connnect(sender,&sender::signal,receiver,&receiver::slot);

这种方式能够在编译阶段就对函数类型、参数个数、参数类型等进行检查。

connect(ui->btnFunctionAddress,&QPushButton::clicked,this,&MainWindow::showNormal);

这里添加按钮btnFunctionAddress,当按钮按下时执行输出窗口正常显示。

2.3、通过UI界面选中按钮并转到槽

        这种方式本质上还是通过QT4版的那种连接方式,通过转到槽后,Qt Creator将自动声明和创建函数,在创建的函数体中编辑要执行的槽函数即可。

 

 这里执行槽函数后设置了输出窗口的标题内容。

2.4、通过UI界面的信号槽编辑页面进行连接

        这种方法和2.3的转到槽连接类似,但这种方式更便于理解,更加形象。

  发送者选择发送的控件,信号则是发送信号类型,接收者即接收目标,槽即要执行的内容和函数。需要添加或删除多个连接时点击右上角的“加号”和“减号”即可。这里添加了按钮btnUIEditSlot发送点击响应函数,执行对应用程序窗口全屏显示的的内容。

2.5、Lambda表达式连接

        Lambda表达式是一种匿名函数方式,也可以称为闭包,它是一种简洁、方便的方式来表示和定义函数。在C++11中的形式为:

[ captures ] ( arguments ) -> return_type { body }
  • [captures]:可选的捕获列表,用于指定Lambda表达式中使用的外部变量。可以通过值捕获或引用捕获来获取外部变量的值。
  • (arguments):参数列表,指定Lambda函数接受的参数。参数可以是零个或多个。
  • -> return_type:箭头符号(->)后面是返回类型,用于指定Lambda函数的返回值类型。
  • { body }:函数体,包含Lambda函数的具体实现。可以是一行简单的表达式,也可以是多行语句块。
connect(ui->btnLambda,&QPushButton::clicked,this,[&](){this->close();});

这里创建按钮名为btnLambda,发送按钮点击信号,应用程序窗口执行关闭的槽函数。

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

QT学习—五种直接连接信号槽的连接方式 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • Vue3头像(Avatar)

    效果如下图 在线预览 APIs 参数 说明 类型 默认值 必传 shape 指定头像的形状 circle square circle false size 设置头像的大小 number large small default Respons
  • 在Django4.03中使用自带的Admin管理后台创建部门表和员工表

    这两天 想帮公司搞个简单的员工管理系统 折腾了两天 查了很多方法 也走了很多弯路 本身自己学艺不精 不过还好 也折腾出来了 现在发表一下 自己的源码和遇到的坑 希望能帮助大家 一 先放源码 djangoProject3 settings p
  • 安卓抓包神器黄鸟HttpCanary安装配置及使用教程

    1 下载安装包 黄鸟抓包下载地址 2 安装下载的apk 3 证书安装问题 vivo手机我安装时打开黄鸟app 会直接弹出 直接安装即可 其他手机 需要去系统设置中安装 3 1 搜索 证书 选择CA证书 3 2 进行本人操作验证 3 3 安装
  • 常见指令及权限理解

    VMware 用来安装虚拟机的软件 在电脑上虚拟出一套计算机硬件环境 CentOS 操作系统 虚拟机 Linux 操作系统内核 Xshell 远程操作软件 可以远程操作linux主机 服务器 在XShell和直接在VMware终端写代码是一
  • 链塔智库

    目录 一 各地政策要闻 宁夏 推广区块链等技术实现数字化转型 宁波 前瞻性布局区块链等未来产业 重庆 区块链等新一代信息技术产业占全市软件业务收入总额近两成 云南 积极探索区块链等新技术在药品安全事前事中事后监管应用 广西 充分发挥跨境金融
  • cpp: Prototype Pattern

    Gold h 此文件包含 Gold 类 原型模式 Prototype Pattern C 14 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit pragma once ifndef GOLD
  • 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

    分析 兔子的对数从第一月开始 1 1 2 3 5 8 规则 从第三月开始 每月的对数是前两月之和 题目问每个月的兔子总数 为更好理解 在此指定具体月数 改为求第20月的兔子总数 本题分别运用三种的方法实现 数组实现 用变量的变化实现 递归实
  • windows上删除不了文件

    遇到文件或者文件夹无法删除或者移动 其实本质是因为有应用或者其他软件在打开它 所以会导致我们无法更改他的位置 解决这个的办法就是把相应的软件关闭掉 把文件释放出来 然后我们就可以正常移动或者删除了 方法 步骤 遇到问题的情况 文件被使用无法
  • MySQL数据库总结 之 函数命令总结

    MySQL命令语句中的函数包含四种 字符串函数 数值函数 日期函数 流程函数 前两篇关于MySQL的博客 地址如下 MySQL数据库 SQL语言命令总结 数据类型 运算符和聚合函数汇总 Flying Bulldog的博客 CSDN博客htt
  • (附源码)计算机毕业设计SSM疫情隔离便民系统

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • 字符串中找出连续最长数字串(两种题型)--C++

    题目描述一 读入一个字符串str 输出字符串str中的连续最长的数字串 输入描述 个测试输入包含1个测试用例 一个字符串str 长度不超过255 输出描述 在一行内输出str中里连续最长的数字串 输入 abcd12345ed125ss123
  • 安装xposed(解决xposed问题)

    科学上网可轻松解决本文的问题 经过测试leidian mumu yeshen三个模拟器的最新版本只有leidian安装完成后可以重启 其他两个均会卡99 模拟器再起不能 MuMu模拟器win版 版本 2 1 3 可以 安装xposed前需关
  • 面试必备—MySQL中数据查询语句

    一 基本概念 查询语句 基本语句 1 select from 表名 可查询表中全部数据 2 select 字段名 from 表名 可查询表中指定字段的数据 3 select distinct 字段名 from 表名 可对表中数据进行去重查询
  • 使用XStream实现Java对象与XML互相转换(不断更新中)

    添加pom依赖
  • 学习周报-2023-0210

    文章目录 一 在SUSE11sp3系统中将openssh从6升级到8 一 需求 二 系统环境 三 部署流程 1 上传编译安装的软件包 2 安装 gcc编译软件 3 安装依赖zlib 4 安装依赖openssl 5 安装openssh 二 在
  • 华为OD机试真题- 战场索敌-2023年OD统一考试(B卷)

    题目描述 有一个大小是NxM的战场地图 被墙壁 分隔成大小不同的区域 上下左右四个方向相邻的空地 属于同一个区域 只有空地上可能存在敌人 E 请求出地图上总共有多少区域里的敌人数小于K 输入描述 第一行输入为N M K N表示地图的行数 M
  • 8-js高级-2

    JavaScript 进阶 2 了解面向对象编程的基础概念及构造函数的作用 体会 JavaScript 一切皆对象的语言特征 掌握常见的对象属性和方法的使用 深入对象 内置构造函数 综合案例 深入对象 了解面向对象的基础概念 能够利用构造函
  • TesseractEngine

    URL http download csdn net download fuxuan928 4068683 GOOGLE https code google com p tesseractdotnet 下面识别OCR验证码用 NET来实现
  • 使用Python爬虫定制化开发自己需要的数据集

    在数据驱动的时代 获取准确 丰富的数据对于许多项目和业务至关重要 本文将介绍如何使用Python爬虫进行定制化开发 以满足个性化的数据需求 帮助你构建自己需要的数据集 为数据分析和应用提供有力支持 1 确定数据需求和采集目标 在开始定制化开
  • QT学习—五种直接连接信号槽的连接方式

    一 信号与槽机制 特别鸣谢B站大轮明王讲Qt的讲解 大轮明王讲Qt的个人空间 哔哩哔哩 bilibili 信号与槽机制 Signal and Slot 是一种在软件开发中广泛使用的通信机制 主要用于处理事件驱动的程序设计 它是Qt框架中的一