QT——信号和槽学习笔记

Qt 信号和槽

信号和槽(Signals and Slots)是Qt框架中的核心机制之一,用于对象之间的通信。它们提供了一种非常灵活和类型安全的事件处理系统,允许对象之间在发生特定事件时进行交互,而不需要紧密耦合。这使得代码更易于维护和扩展。

1.基本概念

信号(Signal)

  • 信号是Qt对象在某些事件发生时自动发出的通知。
  • 常用于表示对象的某种状态改变(如按钮点击、文本框内容改变)。

槽(Slot)

  • 槽是一个普通的成员函数,用于处理信号。
  • 槽可以有参数,参数类型和数量通常与信号匹配。

连接信号和槽(Connect)

  • 使用 QObject 类的 connect() 函数将信号和槽连接起来。
  • 当信号发出时,相关的槽函数被调用。

2. 基本语法

定义信号和槽

定义信号:

signals:void signalName();  // 无参数信号void signalName(int value);  // 带参数信号

定义槽:

public slots:void slotName();  // 无参数槽void slotName(int value);  // 带参数槽

3. 信号和槽的特点:

  1. 松散耦合:信号和槽机制使得对象之间的依赖性降低。发送信号的对象不需要知道接收信号的对象是谁。
  2. 类型安全:在编译时检查信号和槽的参数匹配,这减少了运行时错误的可能性。
  3. 多对多通信:一个信号可以连接多个槽,一个槽也可以连接多个信号。这种机制非常灵活。
  4. 自定义信号和槽:开发者可以定义自己的信号和槽,以满足特定的需求。

4. 自己学习的时候遇到的坑小总结(这部分可能会持续更新):

4.1 信号可以传递信号

  • 两个槽函数的声明:
private slots:void onNumChanged(int value);void onSpinBoxValueChanged(int value);
  • 这是我定义的两个槽函数:
void Widget::onNumChanged(int value)
{qDebug("onNumChanged");ui->progressBar->setValue(value);
}void Widget::onSpinBoxValueChanged(int value)
{qDebug("onSpinBoxValueChanged");emit numChanged(value);
}
  • 信号(只需要signals声明)
signals:void numChanged(int value);
  • connect函数连接:
    connect(ui->spinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int)));connect(this, SIGNAL(numChanged(int)), this, SLOT(onNumChanged(int)));

这部分是spinBox发出信号,接收者当前窗口,槽函数是onSpinBoxValueChanged
然后当前窗口再发送信号,接收者是当前窗口,槽函数是onNumChanged

这部分主要是实验一下自定义槽函数和信号,而不是直接使用valueChanged

  • 重点: 除了中间用onSpinBoxValueChanged(int)这个槽函数来实现以外,可以直接在第一行槽函数的位置改成信号,用信号传递信号
connect(ui->spinBox, SIGNAL(valueChanged(int)), this, SIGNAL(numChanged(int)));
connect(this, SIGNAL(numChanged(int)), this, SLOT(onNumChanged(int)));

这两行代码的功能和上面是一样的!

4.2 信号使用 signals声明,不需要实现,是public

  • 信号(只需要signals声明)
signals:void numChanged(int value);

4.3 槽public/protected/private slots声明,必须实现(重要)

如果头文件里声明了却没有实现,就会报如下错误:

  • error: LNK2019: 无法解析的外部符号 “private: void __cdecl Widget::onSpinBoxValueChanged(int)” (?onSpinBoxValueChanged@Widget@@AEAAXH@Z),函数 “private: static void __cdecl Widget::qt_static_metacall(class QObject *,enum QMetaObject::Call,int,void * *)” (?qt_static_metacall@Widget@@CAXPEAVQObject@@W4Call@QMetaObject@@HPEAPEAX@Z) 中引用了该符号
    在这里插入图片描述

解决办法就是:把不用的槽函数的声明删除掉或者注释掉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3279935.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

App尺寸:5个创新方法,提升界面吸引力

当用户打开应用程序时,应用程序图标是用户认知品牌的第一个门槛,可以直接影响用户对应用程序的第一印象。应用程序图标尺寸直接影响应用程序图标的视觉效果,这也是决定用户是否愿意下载应用程序图标的关键因素。应用程序图标尺寸规范在图标设…

SEO优化 prerender-spa-plugin工具使用 踩坑记录

安装prerender-spa-plugin yarn add prerender-spa-plugin 或 npm install prerender-spa-plugin初始配置 后面记录踩的坑 配置路由 const routes [{path: /,redirect: {path: /HomeView},},{path: /home,redirect: {path: /HomeView},},{ path: /HomeView,component: HomeV…

Linux 用户管理模式

目录 1. 概述 2. 管控级别 3. 用户组管理 4. 用户管理 4.1 创建用户 useradd 4.2 删除用户 userdel ​编辑4.3 查看用户所属组 id 4.4 修改用户所属组 usermod 5. 查看用户/用户组 5.1 查看系统用户 5.2 查看系统用户组 1. 概述 Linux 可以配置多个用户&#xff0c…

C# 调用Webservice接口接受数据测试

1.http://t.csdnimg.cn/96m2g 此链接提供测试代码; 2.http://t.csdnimg.cn/64iCC 此链接提供测试接口; 关于Webservice的基础部分不做赘述,下面贴上我的测试代码(属于动态调用Webservice): 1&#xff…

ros笔记04--从零体验ros2行为通信方式

ros笔记04--从零体验ros2行为通信方式 介绍创建步骤体验官方案例基于python开发行为案例创建action接口创建action sever和client 注意事项说明 介绍 行为是ros2中的一种通信方式,其多被用于一些长时间运行的任务,它包含了目标、反馈、结果三部分。 行为…

Qt Creator使用git管理代码

1.在GitHub中新建仓库,设置好仓库名后,其它的设置默认即可。 2.打开git bash,输入以下命令: git config --global user.name "xxxxx" #设置你的GitHub用户名 git config --global user.email "xxxxxxxxx.…

79.WEB渗透测试-信息收集-框架组件识别利用(3)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:78.WEB渗透测试-信息收集-框架组件识别利用(2)-CSDN博客 struts2…

GPT-4o mini- 开发者的新宠儿

在人工智能的浪潮中,一颗新星正在冉冉升起。OpenAI最新发布的GPT-4o mini模型以其惊人的性能和极具竞争力的价格,正在成为开发者们的新宠儿。作为一名大数据开发者,我深深被这个"迄今为止最具成本效益的小模型"所吸引。让我们一起探索GPT-4o mini的魅力,看看它如何改…

docker(一):Develop faster. Run anywhere.

前言 在进行微服务部署时,首先需要进行部署环境的搭建。目前,Docker 已经成为了微服务部署的主流解决方案之一。Docker 可以帮助我们更快地打包、测试以及部署应用程序,从而缩短从编写到部署运行代码的周期。 在本文中,我们将对…

ITSS:IT服务工程师

证书亮点:适中的费用、较低的难度、广泛的应用范围以及专业的运维认证。 总体评价:性价比良好! 证书名称:ITSS服务工程师 证书有效期:持续3年 培训要求:必须参加培训,否则将无法参与考试 发…

软件-vscode-plantUML-IDEA

文章目录 vscode基础命令 实操1. vscode实现springboot项目搭建 (包括spring data jpa和sqlLite连接) PlantUMLIDEA下载及安装Eval Reset插件配置修改IDEA创建项目的默认目录IDEA配置gitIDEA翻译插件translationIDEA断点调试IDEA全局搜索快捷键不能使用代…

人工智能学习笔记 - 初级篇Ⅱ - 图形可视化 - 第11节: 绘制带填充区域的图表

微信公众号:御风研墨 关注可了解更多。问题或建议,请公众号留言 文章目录 绘制带填充区域的图表应用背景准备工作操作步骤工作原理补充说明最后 绘制带填充区域的图表 应用背景 在数据可视化中,带填充区域的图表可以有效地表示数据范围、趋…

springBoot 3.X整合camunda

camunDa camunDa 是2013年从Activiti5 中分离出来的一个新的工作流引擎。Camunda 官方提供了 Camunda Platform、Camunda Modeler,其中 Camunda Platform 以 Camunda engine 为基础为用户提供可视化界面,Camunda Modeler 是流程文件建模平台&#xff0c…

FMEA在光伏电站安全生产管理中的应用

在绿色能源浪潮席卷全球的今天,光伏电站作为清洁能源的重要支柱,其安全高效运行直接关系到能源供应的稳定与环境的可持续发展。然而,光伏电站的日常运营中潜藏着诸多风险与挑战,如何有效预防事故、保障人员安全及设备稳定运行&…

Aboboo一些操作

常用快捷键⌨ 快捷键/操作方式 功能 鼠标中键/Esc 进入/退出全屏 空格/Tab 暂停/恢复播放 左/右箭头 快退/快进 Ctrl-左/右箭头 30秒快退/快进 Alt-左/右箭头 60秒快退/快进 Ctrl-Alt-左/右箭头 播放速率调节 PageUp/PageDown 上一句/下一句 上下箭头/滚轮 …

算法入门:Java实现排序、查找算法

链接:算法入门:Java实现排序、查找算法 (qq.com) 冒泡/选择/插入/希尔排序代码 (qq.com) 快排/归并/堆排/基数排序代码 (qq.com)

六西格玛管理法

六西格玛管理法是一种旨在提高业务流程效率和减少缺陷的管理策略。它最初由摩托罗拉公司在1980年代末期提出,并随后被通用电气等公司广泛应用和发展。六西格玛的核心理念是通过减少过程变异性来提高产品质量和服务水平。 六西格玛的含义: 统计学概念&am…

【HarmonyOS】鸿蒙中如何获取资源文件的指定类型 fd,string,Uint8Array,RawFileDescriptor

【HarmonyOS】鸿蒙中如何获取资源文件的指定类型 fd,string,Uint8Array,RawFileDescriptor 一、问题背景: 众所周知,在鸿蒙中的资源分为media和rawfile。两者的区别对标android工程一致,后者是其他类型文…

笑谈“八股文”,人生不成文

一、“八股文”在实际工作中是助力、阻力还是空谈? 作为现在各类大中小企业面试程序员时的必问内容,“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢?有IT人士不禁发出疑问:程序员面试…

未来社交:Facebook如何定义虚拟现实的新时代?

随着科技的飞速发展,虚拟现实(VR)逐渐从科幻小说中的幻想变成了现实生活中的前沿技术。在这一领域,Facebook(现已更名为Meta)扮演了重要角色,通过不断的创新和投资,致力于打造一个全…