QT 信号和槽的使用笔记

2023-10-27

 

目录

信号和槽介绍

回调机制

信号槽机制

信号

信号槽和直接调用效率问题

信号和槽的使用对比

QT5 写法

QT4 写法

总结


信号和槽介绍

信号与插槽机制,提供对象间的通信机制。可以取代原始的回调和消息映射机制。信号与槽是迅速的,类型安全的,健壮的,完全面向对象并用C++实现的一种机制。

回调机制

  1. 不能确认回调执行时候传递进来的函数参数是否是正确的类型,容易造成进程崩溃。
  2. 回调这种方式紧紧绑定了图形用户接口的功能元素,很难吧开发进行独立的分类。

信号槽机制

  1. 信号与槽机制是类型安全的,它以警告的方式报告类型错误,而不会使系统产生崩溃。
  2. 信号和槽通过使用connect()函数建立连接,不要求类之间想回知道细节,可以方便开发出代码高可用的类。

信号

当对象内部状态发生改变,然后发射信号。

只有定义了一个信号的类和他的子类才能发射这个信号。信号可以重载。

  1. 当一个和槽连接的信号被发射时候,这个槽被调用。

  2. 槽和普通函数一样,特点是可以被信号连接。槽的参数不能含有默认值。

  3. 槽函数可以定义为虚函数,子类通过重写也是非常有用的。

  4. 槽函数和普通函数一样具有访问权限。

Pubic slots:任何信号都可以连接。

Protected slots:这个类和它的子类可以连接。

Private slots:这个类本身的信号可以连接。

 

信号槽和直接调用效率问题

信号和槽对比回调稍微有些慢,但是其灵活性的优势,在开发中速度可以被忽略。通常发射一个和槽相连接的信号,大约只比直接调用那些非虚函数的接收器慢十倍。这是定位连接对象造成的开销。

十个非虚函数调用时间开销大概比“new”和“delete”操作少一些。在一台i585-500机器上,每秒钟大概发送2 000 000个左右信号到一个接收器上,或者发送1 200 000到两个接收器上。

 

信号和槽的使用对比

连接信号和槽函数connect(sender, signal, receiver, slot);

sender:发出信号的对象

signal:发送对象发出的信号

receiver:接收信号的对象

slot:接收对象在接收到信号之后所需要调用的函数

QPushButton button("Quit");

QT5 写法

QObject::connect(&button, &QPushButton::clicked,&app, &QApplication::quit);

编译期间检查类型是否匹配。Qt 5 中,任何成员函数、static 函数、全局函数和 Lambda 表达式都可以作为槽函数。

 

QT4 写法

QObject::connect(&button, SIGNAL(clicked()), &app, SLOT(quit()));

SIGNAL和SLOT这两个宏,将两个函数名转换成了字符串,编译期间检查不出错误,出现问题在运行期间表现。可能造成程序不稳定。

写到这里发现网上有一个图片,内容总结的挺好。分享给大家。

(图片来源于:https://www.cnblogs.com/wanghui1234/p/8964968.html

总结

信号和槽的使用必须包含Q_OBJECT宏在使用信号和槽的类中,在MOC元编译器编译源文件时候遇到该宏辉自动生成另一个包含有元对象的C++代码。在使用信号和槽是,其特殊性,要注意一下问题。

  1. Signal,slot 可以接受参数,但是不能接受函数的指针
  2. 不支持缺省的参数
  3. 所有的signal和slot不能有返回值(必须是void)
  4. Slot可以是虚函数
  5. Signal的访问权限和protected相同,只有本身和其派生类可以emit signal
  6. Signal和slot不能是构造函数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 信号和槽的使用笔记 的相关文章

  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 使用 mingw32 在 Windows 上构建 glew 时“DllMainCRTStartup@12”的多个定义

    我关注了这个主题 使用 mingw 使建筑物在 Windows 上闪闪发光 https stackoverflow com questions 6005076 building glew on windows with mingw 6005
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • 类中不允许使用不完整类型,但类模板中允许使用不完整类型

    以下为无效代码 struct foo struct bar bar x error field x has incomplete type struct bar int value 42 int main return foo x valu
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题

随机推荐

  • 简易聊天室代码分享 js+socket.io

    先言 这我以前写的 这里就是单纯分享下代码 不算正经文章 效果如下 前端用一个单html文件 然后后端用node js和socket io 也是只用一个单js文件就好 这里可以看下代码的实现逻辑就好 因为来连数据库才能运行的 有需要的话告诉
  • java2习题3

    1 编写应用程序求1 2 10 1 用for和while循环语句进行1 2 10 的计算 package yingshu public class one public static void main String args TODO A
  • Mybatis——基础使用学习

    Mybatis 基础使用学习 1 简介 1 1 什么时Mybatis 1 2 持久化 1 3 持久层 1 4 为什么需要Mybatis 2 第一个Mybatis程序 2 1 搭建环境 2 2 创建一个模块 配置好mybatis 2 3 编写
  • Eclipse导入maven项目Pom.xml文件报错处理方法

    文章转载自 https blog csdn net jianzhonghao article details 72858465 Eclipse导入maven项目时 Pom xml文件报错处理方法 导入maven项目 FIle Import
  • css实现分页效果

  • 设有n项任务,加工时间分别表示为正整数t1,t2,...,tn。背包问题系列

    设有n项任务 加工时间分别表示为正整数t1 t2 tn 现有2台同样的机器 从0时刻可以安排对这些任务的加工 知道T时刻所有任务完成 总加工时间为T 设计算法使得总加工时间T最小的调度方案 设给定的实例 t1 1 t2 5 t3 2 t4
  • linux学习(五)解决github网页无法进入

    文章目录 前言 1 问题 2 解决 前言 准确来说这个内容不属于linux学习 但是使用git管理代码时需要用到 这里就提前准备一下 1 问题 github网页无法刷出来 一直转圈 2 解决 step1 找到C Windows System
  • 取整函数_6个Excel取整函数技巧,让你的数据规规矩矩!

    Excel技巧是十分神奇的 可以用来娱乐 也能用来工作 更重要的是可以工作效率 不管是在什么地方 最不讨人喜欢的就是有小数点的数据 那怎么办了 今天就来教给大家6个超简单又很实用的Excel取整函数 1 CEILING 函数取整 CEILI
  • windows10编译open3d 0.13

    目录 写在前面 准备 获取源码 cmake cmake版本 开始cmake 1 命令行 2 cmake gui 编译 安装 测试 完 写在前面 1 环境 win10 visual studio2019 cmake3 22 0 rc1 下载源
  • C语言浮点数存储规则

    1 浮点型数据类型 float double long double 目前常用的类型为float 用于存储单精度浮点数和双精度浮点数 浮点数使用IEEE 电气和电子工程协会 格式 浮点类型的32位浮点数具有 4 个字节 包括一个符号位 一个
  • 【FPGA学习】状态机实现UART通信

    文章目录 前言 一 数据帧结构 二 接收模块 2 1 状态设置 2 1 状态跳转 2 2 奇校验 2 3 数据输出 三 发送模块 3 1 状态跳转 3 2 数据输出 四 顶层模块 总结 前言 在之前的文章中 FPGA学习 实例一 Cyclo
  • 7、Java入门教程【面向对象】

    面向对象是Java编程的核心概念 如果不能充分了解面向对象的思想 那么会给你在实际的项目开发过程中 带来很多业务设计上的困扰 一 构造器 我们在设计完一个类 在使用这个类去创建对象实例的时候 有些场景是需要对实例做初始化操作的 那么Java
  • 雅思备考资料整理

    单纯想整理一下自己使用过的素材 梳理一下自己学习到的经验 万一以后还需要考呢 一 听力 何琼听力网课 王陆语料库 王陆建议听写前先过一遍单词 进行同义词整理 听写到后面几章速度很快 写下来很耽误时间也跟不上 我是边听脑子里就同时反应单词怎么
  • java自定义数组_java创建自定义类的数组

    今天在学图论的最小生成树 开始一直在想是用邻接矩阵还是关联矩阵来表示图 但是发现这样都会有好多空间浪费 于是我就自定义一个边的类 里面包含了权值 关联的端点1 端点2 和图的表示字母 发现我想创建11条边 Bian new Bian 11
  • 第6章 K8s基础篇-资源调度

    杜宽老师k8s课程学习记录 6 1 Replication Controller和ReplicaSet Replication Controller 复制控制器 RC 和ReplicaSet 复制集 RS 是两种简单部署Pod的方式 因为在
  • python全栈开发优势条件_Python全栈开发-day01-初识python

    一 Python学习的大致框架 1 linux基础 计算机以及日后我们开发的程序放置的服务器的简单操作 2 Python开发 1 Python基础 2 网络编程 断点续传 一般情况下不需要我们自己开发 3 web框架 用于写网站 4 设计模
  • 等保测评:SQLServer操作超时

    一 说明 本文说的是等级保护1 0中SQLServer数据库操作超时的内容 实际在SQLServer中有很多种超时选项 很容易将其混为一谈 本文将尽力将之说清楚 二 操作超时的意义 操作超时在sqlserver数据库中可能包含好几个意思 2
  • BeagleBone 嵌入式操作

    特点 BeagleBone Black 是一个嵌入式系统 能够运行完整的 GNU Linux 发行版 例如 Debian 或 Ubuntu BeagleBone Black 具有强大的分发功能 并配有易于扩展的嵌入式板卡 是一款允许用户构建
  • JAVA浏览器控件JxBrowser v7.3上线!最新API文档打包带走!

    JxBrowser是将基于Chromium的浏览器与Java应用程序集成 以处理和显示HTML5 CSS3 JavaScript Flash等 近日 JxBrowser v7 3发布上线 支持最新macOS Catalina 支持Java1
  • QT 信号和槽的使用笔记

    目录 信号和槽介绍 回调机制 信号槽机制 信号 槽 信号槽和直接调用效率问题 信号和槽的使用对比 QT5 写法 QT4 写法 总结 信号和槽介绍 信号与插槽机制 提供对象间的通信机制 可以取代原始的回调和消息映射机制 信号与槽是迅速的 类型