Qt——信号和槽

一.信号和槽概述

谈及信号,很容易联想到在Linux系统中所分享到的信号。那么Linux信号和Qt信息有什么不同?

在 Qt 中,用户和控件的每次交互过程称为⼀个事件。比如 "用户点击按钮" 是⼀个事件,"用户关 闭窗口" 也是⼀个事件。每个事件都会发出⼀个信号,例如用户点击按钮会发出 "按钮被点击" 的信 号,用户关闭窗口会发出 "窗口被关闭" 的信号。

Qt信号同样包含三个要素:

  1. 由哪个控件发出。
  2. 信号的类型,如点击按钮信号,移动输入框光标信号等等。
  3. 信号的处理方式:槽(slot),即函数。

槽函数,就是对信号进行响应的函数,将信号与对应的槽函数关联之后,只要信号发出,就能执行对应的槽函数功能。


二.connect关联

在Qt中,想要将信号和槽函数关联起来,可以使用函数connect

connect(const QObject *sender,

               const char *signal,

               const QObject *receiver,

               const char *method,

               Qt::ConnectionType type = Qt::AutoConnection);

sender:信号的发送者;
signal:发送的信号(信号函数);
receiver:信号的接收者;
method:接收信号的槽函数;
type: 用于指定关联方式,默认关联方式为 Qt::AutoConnection,通常不需要手动设定。
disconnect()函数可以断开信号和槽的连接,参数与connect一致。
下面我们设计一个界面,界面上存在一个关闭按钮,点击按钮即可关闭界面:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton *myButten = new QPushButton(this);myButten->setText("关闭");myButten->move(200,200);connect(myButten,&QPushButton::clicked,this,&Widget::close);
}

分析这段代码,QPushButten为按钮类,随后为其命名为“关闭”,并设置其在界面中的位置

在connect函数中,定义的按钮myButten为信号的发送者clicked为信号函数,即“按钮被按下”这个信号this为信号的执行者,即Widget对象,也就是界面本身close为接收到信号后要执行的槽函数,即关闭界面

运行程序,点击关闭即可关闭界面。

这里扩展一点知识:

实际上上述所给出的connect函数的参数,是老版本的Qt中的connect函数,能够看到参数2和参数4,是两个char* 类型的函数指针,但实际上所传入的函数指针,并不一定都是char*类型,在老版本中,需要通过宏来修改两个参数的类型,这样太过麻烦,所以在Qt5版本之后,将connect的参数改为了模版类型,并且带有了一定的参数检查功能,即参数2和参数4必须分别是参数1和参数3两个对象的成员函数,否则就会编译出错。


三.自定义信号和槽

在上述操作中,我们所使用的信号函数和槽函数,都是对应的控件中所自带的,但是自带的这些信号和槽,肯定不能满足我们所有的需求,所以我们还需要进行自定义。


1.自定义槽函数

槽函数的本质,还是类中的一个成员函数。

(1)代码方式

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QPushButton *myButten = new QPushButton(this);myButten->setText("按钮");myButten->move(200,200);connect(myButten,&QPushButton::clicked,this,&Widget::handleClick);
}void Widget::handleClick()
{this->setWindowTitle("按钮被按下!");
}

注意成员函数必须要在.h文件中先进行声明。

这里我们编写了一个名为handleClick的成员函数,并由connect进行连接,代码的含义为:点击按钮就会修改界面的标题为“按钮被按下!”,结果如下:


(2)界面操作

我们在界面设计中设计一个按钮,然后右键点击,能够看到一个“转为槽”的选项,点击,就能得到当前的QPushButten控件,及其父控件的所有的信号函数

我们选择clicked信号,点击OK,随后就会跳转到.cpp文件,并创建一个对应的函数,同时该函数也会在.h文件中进行声明:

随后就可以在该函数中进行代码编写:

void Widget::on_pushButton_clicked()
{this->setWindowTitle("按钮已经按下");
}

 运行代码,结果如下:

 能够看出,通过界面设计的槽函数,不需要使用connect函数进行连接,也可以直接实现槽函数对信号的响应

这与槽函数的名字有关,这样一个规则的名字命名方式,Qt就能自动把信号和槽函数建立联系。

on_pushButton_clicked


2.自定义信号

自定义信号比较少见,在实际开发中很少会需要自定义信号,因为在GUI中,用户能够进行的操作,是可以穷举的,Qt内置的信号,基本上已经覆盖到了所有可能得用户操作。

信号是一类非常特殊的函数,定义自定义信号函数时,我们只需给出函数声明即可信号函数的返回值必须是void,有没有参数都可以。

此时,我们需要告诉Qt,这是一个“信号”,通过在类中使用signals关键字当代码扫描到该关键字时,就会自动把下面的函数认为是信号,随后给这些函数自动生成函数定义

Qt内置的信号,都不需要我们手动通过代码来触发,那么自定义出的信号,该如何触发呢?

通过emit关键字 + 信号函数,可以触发自定义信号,当然直接调用信号函数,也可以触发信号。

signals:void mySignal();
public:void handleMySignal();

在类中声明信号。

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,&Widget::mySignal,this,&Widget::handleMySignal);emit mySignal();//mySignal();
}void Widget::handleMySignal()
{this->setWindowTitle("触发自定义信号");
}

随后进行连接并触发信号,结果如下:


3.信号和槽传参

我们在使用信号时,也可以设置参数,当信号设置参数之后,对应连接的槽函数也必须拥有相同的类型的参数,参数的个数可以不一致,但信号的参数必须比槽函数的个数多

信号传参,本质是将参数的内容传递给槽函数,从而槽函数就可以使用参数内容:

signals:void mySignal(const QString& text);
public:void handleMySignal(const QString& text);
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,&Widget::mySignal,this,&Widget::handleMySignal);emit mySignal("信号传参");
}void Widget::handleMySignal(const QString& text)
{this->setWindowTitle(text);
}

结果如下:


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

必胜客万圣节“邪恶鬼手披萨”,品牌营销的“鬼”才之作!

在万圣节的神秘氛围下,各大品牌纷纷推出创意营销活动,试图在这个充满奇幻色彩的节日里捕获消费者的心。其中,必胜客推出的“邪恶鬼手披萨”无疑是一次令人拍案叫绝的品牌营销“鬼”才之作,它不仅巧妙地融合了节日元素,…

3D Gaussian Splatting代码详解(一):模型训练、数据加载

1 模型训练 def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint, debug_from):first_iter 0# 初始化高斯模型,用于表示场景中的每个点的3D高斯分布gaussians GaussianModel(dataset.sh_degree)# 初始化…

[MySQL#6] 表的CRUD (1) | Create | Retrieve(查) | where

目录 1. 插入 1.1 单行数据 - 全列插入 指定列插入 1.2 多行数据 - 全列插入 指定列插入 1.3 更新 1.4 替换 2. 查找 2.1 select 列 2.2 where 条件 具体案例 2.3 结果排序 总结关键字执行顺序 2.4 筛选分页结果 CRUD : Create(创建),Retrieve(读取)&…

[机器学习]集成学习

1 集成学习 强强联合、弱弱变强Bagging(平权投票):随机森林Boosting(加权投票):Adaboost、GBDT、XGBoost、LightGBM 2 随机森林 3 Adaboost 放大错误数据,缩小正确数据

第三十三篇:TCP协议如何避免/减少网络拥塞,TCP系列八

一、流量控制 一般来说,我们总是希望数据传输得更快一些,但是如果发送方把数据发送得太快,接收方可能来不及接收,造成数据的丢失,数据重发,造成网络资源的浪费甚至网络拥塞。所谓的流量控制(fl…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具,不仅可以筛选内容,而且可以筛选颜色,例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格(下图右侧所示),其他单元格的填充色不固定,有几种颜色…

数据结构---链表(一)【不带头单向非循环】

文章目录 链表概念链表的使用LinkedList 的几种遍历方式单链表的模拟实现(不带头)链表面试题 观察ArrayList 顺序表的源码发现,底层是使用数组实现的。由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时&#xf…

Pytorch(一)

一.PyTorch环境配置及安装 1.1 工具安装 1.1.1 Anaconda下载 清华大学镜像站下载,版本为Anaconda3-5.2.0-Windows-x86_64(对应python3.6.5) Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 1.1.2…

关于我的数据结构与算法——初阶第二篇(排序)

(叠甲:如有侵权请联系,内容都是自己学习的总结,一定不全面,仅当互相交流(轻点骂)我也只是站在巨人肩膀上的一个小卡拉米,已老实,求放过)。 排序的概念及其运…

AI驱动的低代码未来:加速应用开发的智能解决方案

引言 随着数字化转型的浪潮席卷全球,企业对快速构建应用程序的需求愈发强烈。然而,传统的软件开发周期冗长、成本高昂,往往无法满足快速变化的市场需求。在此背景下,低代码平台逐渐成为开发者和企业的优选方案,以其“低…

三周精通FastAPI:21 子依赖项和路径操作装饰器依赖项

官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/sub-dependencies/#_6 子依赖项 FastAPI 支持创建含子依赖项的依赖项。 并且,可以按需声明任意深度的子依赖项嵌套层级。 FastAPI 负责处理解析不同深度的子依赖项。 第一层依赖项 …

模具生产管理系统软件:提升制造业效率的新利器

引言 我们都知道,企业面临着提高生产效率、降低成本和提升产品质量的压力。模具生产作为制造过程中至关重要的一环,如何有效管理和优化模具生产过程,成为企业关注的重点。模具生产管理系统应运而生,能够为企业提供实时监控、流程…

MySQL中,如何定位慢查询?定位到的慢SQL如何分析?

目录 1. 慢查询发生的场景? 2. MySQL中,如何定位慢查询? 2.1 详细解释 3. 定位到的慢SQL如何分析? 3.1 详细说明 1. 慢查询发生的场景? 2. MySQL中,如何定位慢查询? 介绍一下当时产生问题…

「C/C++」C++ 设计模式 之 单例模式(Singleton)

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

华为云开源项目Sermant正式成为CNCF官方项目

近日,云原生计算基金会(CNCF)正式接纳由华为云发起的云原生无代理服务网格项目Sermant。Sermant的加入,极大地丰富了云原生微服务治理技术的探索、创新和发展,为CNCF社区注入了新的活力。 Sermant是华为云在微服务治理…

用sdcc给51单片机编译C程序

学习单片机大部分人用的是Keil uVision,虽然好用,可大部分人用的是盗版,其实单片机程序小的话,完全可以用文本编辑器(推荐notepad)编写,然后用免费的sdcc来编译,下面介绍一下大致的过程。 sdcc…

Ajax:表单 模板引擎

Ajax&#xff1a;表单 & 模板引擎 form 表单form 属性 Ajax操控表单事件监听阻止默认行为收集表单数据 模板引擎art-template{{}}语法原文输出条件输出循环输出过滤器 原理 form 表单 在HTML中&#xff0c;可以通过<form>创建一个表单&#xff0c;收集用户信息。而采…

【水下生物数据集】 水下生物识别 深度学习 目标检测 机器视觉 yolo(含数据集)

一、背景意义 随着全球海洋生态环境的日益变化&#xff0c;水下生物的监测和保护变得愈发重要。水下生物种类繁多&#xff0c;包括螃蟹、鱼类、水母、虾、小鱼和海星等&#xff0c;它们在海洋生态系统中扮演着关键角色。传统的水下生物监测方法通常依赖于人工观察&#xff0c;效…

[vulnhub]Kioptrix: Level 1.2 (#3)

https://www.vulnhub.com/entry/kioptrix-level-12-3,24/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是169 nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-29 13:16 CST …

TVM前端研究--Relay

文章目录 深度学习IR梳理1. IR属性2. DL前端发展3. DL编译器4. DL编程语言Relay的主要内容一、Expression in Relay1. Dataflow and Control Fragments2. 变量3. 函数3.1 闭包3.2 多态和类型关系3.3. Call4. 算子5. ADT Constructors6. Moudle和Global Function7. 常量和元组8.…