【嵌入式Qt开发入门】初识信号与槽

news2024/11/16 20:36:58

        信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。

        信号(Signal)就是在特定情况下被发射的事件,例如 PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。

        GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。

        槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的 C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。 槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。 信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:

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

        connect() 是 QObject 类的一个静态函数,而 QObject 是所有 Qt 类的基类,在实际调用时可以忽略前面的限定符,所以可以直接写为:

connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

        其中,sender 是发射信号的对象的名称,signal() 是信号名称。信号可以看做是特殊的函 数,需要带括号,有参数时还需要指明参数。receiver 是接收信号的对象名称,slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。

        SIGNAL 和 SLOT 是 Qt 的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串。例如,在【嵌入式Qt开发入门】使用 UI 设计器开发程序的项目 02_designer_example 的 ui_mainwindow.h 文件中,在 setupUi() 函数中有如下的语句:

QObject::connect(pushButton, SIGNAL(clicked()), MainWindow, SLOT(close()));

        其作用就是将 pushButton 按钮的 clicked() 信号与窗体(MainWindow)的槽函数 close() 相 关联,这样,当单击 pushButton 按钮(就是界面上的“X”按钮)时,就会执行 MainWindow 的 close() 槽函数。关于信号与槽的使用,有以下一些规则需要注意: 一个信号可以连接多个槽,例如:

connect(pushButton, SIGNAL(clicked()), this, SLOT(hide());
connect(pushButton, SIGNAL(clicked()), this, SLOT(close());

        这是当一个对象 pushButton 的被单击时,所在窗体有两个槽进行响应,一个 hide()用于隐藏主窗体,一个 close 用于关闭主窗体。这里只是举个例子,实际上当执行 close()后,hide()这个槽已经没有什么意义了,因为已经程序退出了,但是实际它有执行,因为它连接在 close()的前面。当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次执行。

        当信号和槽函数带有参数时,在 connect()函数里,要写明参数的类型,但可以不写参数名 称。 多个信号可以连接同一个槽,例如在 designer_example 里,我们再拖 2 个 pushButton 到设计的窗体里。同时也让它按【嵌入式Qt开发入门】使用 UI 设计器开发程序里的第一种方法连接信号与槽,把三个按钮的 clicked() 信号都连接到 close()槽函数里。编译后可以在 ui_mainwindow.h 这个文件里的 setupUi()函数里, 有如下的信号槽连接语句。

connect(pushButton,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton_2,SIGNAL(clicked()),this,SLOT(close()));
connect(pushButton_3,SIGNAL(clicked()),this,SLOT(close()));

        这样,当任何一个 pushButton 被单击时,都会执行 close()函数,进而关闭或者退出程序。 一个信号可以连接另外一个信号,例如:

connect(pushButton, SIGNAL(objectNameChanged(QString)),this, SIGNAL(windowTitelChan
ged(QString)));

        这样,当一个信号发射时,也会发射另外一个信号,实现某些特殊的功能。

        严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。 如果不匹配,会出现编译错误或运行错误。

        在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT(特别重要)

        当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。 只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

        总结如下图,可以看到发送者与发送的信号是在一起的,接收者与接收的信号/槽是在一起的。它们不能在 connect()方法里写乱顺序!由发送者发送出信号到接收者用信号/槽接收。

         信号槽连接的方法已经讲解了。这里只是稍稍提一下,断开连接的方法,初学者基本用不到断开连接的操作。使用 disconnect()这个方法重载了好几个函数,解开格式如下。

bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)

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

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

相关文章

【Linux】C++项目实战-高并发服务器详析

目录 多进程实现并发服务器多线程实现并发服务器BIO模型NIO模型I/O多路复用(I/O多路转接)select主旨思想图解原理函数解析代码举例select的缺点 poll函数解析代码示例 epoll(最重要,请重点掌握)函数解析代码举例epoll的两种工作模式 橙色 多…

GO语言使用最简单的UI方案govcl

接触go语言有一两年时间了。 之前用Qt和C#写过桌面程序,C#会被别人扒皮,极度不爽;Qt默认要带一堆dll,或者静态编译要自己弄或者找库,有的库还缺这缺那,很难编译成功。 如果C# winform可以编译成二进制原生…

Android 应用层 到 HAL 层

Android 应用层 到 HAL 层 1、相关知识点1.1 概要1.2 参考 2、拿SensorService举例2.1 Android Apps > Android Framework阶段2.2 Android Framework内部阶段2.2.1 frameworks/base2.2.2 frameworks/native 2.3 Android Framework > HAL 阶段2.3.1 旧版 HAL 1、相关知识点…

前段搜索框不请求接口隐藏数据

项目介绍:uview-ui 1.x的,并且使用语言切换功能(i18n,hbuilder新建项目选择i18n项目),因为是h5项目,所以使用location.reload()进行刷新 效果图: 主要判断在 v-if“!keyword || i…

Git 之 reset --hard 回退/回滚到之前的版本代码后,后悔了,如何在恢复之后的版本的方法简单整理

Git 之 reset --hard 回退/回滚到之前的版本代码后,后悔了,如何在恢复之后的版本的方法简单整理 目录 Git 之 reset --hard 回退/回滚到之前的版本代码后,后悔了,如何在恢复之后的版本的方法简单整理 一、简单介绍 二、操作步骤…

Redis是什么?(详细安装步骤)

一、Redis简介🍉 背景 在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少…

代码随想录二刷 day38 | 动态规划之 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

day38 509. 斐波那契数1 确定dp数组以及下标的含义2 确定递推公式3 dp数组如何初始化4 确定遍历顺序5 举例推导dp数组 70. 爬楼梯1 确定dp数组以及下标的含义2 确定递推公式3 dp数组如何初始化4 确定遍历顺序5 举例推导dp数组 746. 使用最小花费爬楼梯1 确定dp数组以及下标的含…

Golang每日一练(leetDay0113) 奇偶链表、链表随机节点

目录 328. 奇偶链表 Odd Even Linked-list 🌟🌟 382. 链表随机节点 Llinked-list Random Node 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日…

docker安装php GD库

故事是这样的: 公司采购了一套商城源码,使用的是 TP5,同事先行,用宝塔部署到生产环境,运行正常。后面我忙完手里的项目,也加入其中,我本地使用的是 docker 当我部署好开始运行时,发…

初学mybatis(三)ResultMap及分页

学习回顾:初学mybatis(二) 一、查询为null问题 要解决的问题:属性名和字段名不一致 环境:新建一个项目,将之前的项目拷贝过来 1、查看之前的数据库的字段名 2、Java中的实体类设计 public class User {pri…

Redis各数据类型操作命令

一、Redis数据类型及命令 (一)String 类别命令描述命令示例备注取/赋值操作赋值set key valueset lclkey lclvalue取值 get keyget lclkey取值并赋值getset key valuegetset lclkey1 lclvalue1获取原值,并设置新的值仅当不存在时赋值setnx k…

服务器解析漏洞与cms靶场搭建教程

文章目录 一、解析漏洞定义二、Kali安装docker并搭建DVWA靶场三、Win7 IIS7漏洞复现四、BEES靶场搭建五、CPMS靶场搭建六、SDCMS靶场搭建 一、解析漏洞定义 解析漏洞主要是一些特殊文件被Apache、IIS、Nginx等Web服务器在某种情况下解释成脚本文件格式并得以执行而产生的漏洞 …

The Company Requires Superficial StudyPHP 变量的使用 ③

作者 : SYFStrive 博客首页 : HomePage 📜: PHP MYSQL 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 &#x1f44…

基于Java电动车租赁网站设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

信号链噪声分析20

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 所有模数转换器(ADC)都有一定量的“折合到输入端噪声”,可以将其模拟为与无噪声 ADC 输入串联的噪声源。折合到输入端噪声与量化噪声不同,后者仅在 ADC 处理交流 信号时出现。多数情况下&#x…

嵌入式中C++开发的基本操作方法

第一:面向对象 1、配置环境 虚拟机上网(ping www.baidu.com)sudo apt-get update //更新软件包sudo apt-get install -f //更新软件依赖sudo apt-get install g //安装c编译器 2、C发展 c98,第一版 c03,c11,c17 3、为什么学习C 4、面向对…

python包的研究

目录 json的方法timecollectionsdatetimetimestampsocket json的方法 json.load:表示读取文件,返回python对象 json.dump:表示写入文件,文件为json字符串格式,无返回 json.dumps:将python中的字典类型转换…

11-Vue常见优化手段

前言: 永远不要过早优化,见招拆招 使用key 对于通过循环生成的列表,应给每个列表项一个稳定且唯一的key,这有利于在列表变动时,尽量少的删除,新增,改动元素 index作为key值是唯一的,但不够稳…

STM32外设系列—sg90(舵机)

文章目录 一、sg90简介二、引脚连接三、控制方法四、程序设计4.1 配置定时器4.2 编写控制程序 五、360舵机 一、sg90简介 首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。…

threejs物理效果和声音

个人博客地址: https://cxx001.gitee.io 一、Threejs中如何创建物理场景 threejs中创建物理场景我们用它的扩展库:Physijs。它可以使场景中的对象有重力效果,可以相互碰撞,施加力之后可以移动,还可以通过合页和滑块在移动过程中…