当前位置: 首页 > article >正文

QT开发(6)--信号和槽

这里写目录标题

  • 1. 信号和槽概述
    • 信号的本质
    • 槽的本质
  • 2. 信号和槽的使用
    • 2.1 连接信号和槽
    • 2.2 文档查询
  • 3.自定义信号和槽
    • 3.1 自定义槽
    • 3.2 自定义信号
    • 3.3 带参数的信号和槽
  • 4. 信号和槽的断开

在这里插入图片描述

1. 信号和槽概述

 	在Qt中,⽤⼾和控件的每次交互过程称为⼀个事件。⽐如"⽤⼾点击按钮"是⼀个事件,"⽤⼾关 闭窗⼝"也是⼀个事件。每个事件都会发出⼀个信号,例如⽤⼾点击按钮会发出"按钮被点击"的信 号,⽤⼾关闭窗⼝会发出"窗⼝被关闭"的信号。Qt 中的所有控件都具有接收信号的能⼒,⼀个控件还可以接收多个不同的信号。对于接收到的每 个信号,控件都会做出相应的响应动作。例如,按钮所在的窗⼝接收到"按钮被点击"的信号后,会做 出"关闭⾃⼰"的响应动作;再⽐如输⼊框⾃⼰接收到"输⼊框被点击"的信号后,会做出"显⽰闪烁的 光标,等待⽤⼾输⼊数据"的响应动作。在Qt中,对信号做出的响应动作就称之为槽。信号和槽是Qt特有的消息传输机制,它能将相互独⽴的控件关联起来。⽐如,"按钮"和"窗⼝" 本⾝是两个独⽴的控件,点击"按钮"并不会对"窗⼝"造成任何影响。通过信号和槽机制,可以将"按 钮"和"窗⼝"关联起来,实现"点击按钮会使窗⼝关闭"的效果。

信号的本质

信号是由于⽤⼾对窗⼝或控件进⾏了某些操作,导致窗⼝或控件产⽣了某个特定事件,这时Qt对 应的窗⼝类会发出某个信号,以此对⽤⼾的操作做出反应。因此,信号的本质就是事件。如:

  • 按钮单击、双击
  • 窗⼝刷新
  • ⿏标移动、⿏标按下、⿏标释放
  • 键盘输⼊

​那么在Qt中信号是通过什么形式呈现给使⽤者的呢?

  • 我们对哪个窗⼝进⾏操作,哪个窗⼝就可以捕捉到这些被触发的事件。
  • 对于使⽤者来说触发了⼀个事件我们就可以得到Qt框架给我们发出的某个特定信号。
  • 信号的呈现形式就是函数,也就是说某个事件产⽣了,Qt框架就会调⽤某个对应的信号函数,通知使⽤者。
    在Qt中信号的发出者是某个实例化的类对象。

槽的本质

槽(Slot)就是对信号响应的函数。槽就是⼀个函数,与⼀般的C++函数是⼀样的,可以定义在类的任何位置(public、protected或private),可以具有任何参数,可以被重载,也可以被直接调⽤(但是不能有默认参数)。槽函数与⼀般的函数不同的是:槽函数可以与⼀个信号关联,当信号被发射时,关联的槽函数被⾃动执⾏。

说明

  1. 信号和槽机制底层是通过函数间的相互调⽤实现的。每个信号都可以⽤函数来表⽰,称为信号函数;每个槽也可以⽤函数表⽰,称为槽函数。例如:"按钮被按下"这个信号可以⽤clicked()函数表⽰,"窗⼝关闭"这个槽可以⽤close()函数表⽰,假如使⽤信号和槽机制实现:"点击按钮会关闭窗⼝"的功能,其实就是clicked()函数调⽤close()函数的效果。
  2. 信号函数和槽函数通常位于某个类中,和普通的成员函数相⽐,它们的特别之处在于:
  • 信号函数⽤ signals关键字修饰,槽函数⽤publicslots、protectedslots或者privateslots修饰。signals和slots是Qt在C++的基础上扩展的关键字,专⻔⽤来指明信号函数和槽函数;
  • 信号函数只需要声明,不需要定义(实现),⽽槽函数需要定义(实现)。

2. 信号和槽的使用

2.1 连接信号和槽

在Qt中,QObject类提供了⼀个静态成员函数connect(),该函数专⻔⽤来关联指定的信号函数和槽函数。

关于QObject
QObject 是Qt内置的⽗类.Qt中提供的很多类都是直接或者间接继承⾃QObject.
列如:
在这里插入图片描述

connect() 函数原型:

QMetaObject::Connection connect(const QObject *sender,//当前信号由哪个控件发出const char *signal,//信号类型const QObject *receiver,//哪个对象负责处理const char *method,//这个对象该怎么处理Qt::ConnectionType type = Qt::AutoConnection//可选参数,暂时不用管
)

参数说明

  • sender:指向发送信号的对象的指针。当这个对象发出指定的信号时,连接会被触发。
  • signal:一个 C 风格的字符串,表示要连接的信号的名称。所谓的信号也是QT中对象提供的一些成员函数。
  • receiver:指向接收信号的对象的指针。这个对象将执行与信号关联的槽函数。
  • method:一个 C 风格的字符串,表示要连接的槽函数的名称。
  • type:可选参数,指定连接的类型。默认值为 Qt::AutoConnection,表示根据发送者和接收者的线程关系自动选择连接类型。
    connect 函数就具有了一定的参数检查功能.列如:
    如果你传入的第一个参数和第二个参数不匹配, 或者第三个参数和第四个参数不匹配. (不匹配, 2 , 4 参数的函数指针, 不是 1 , 3 参数的成员函数) 此时代码编译出错.详细使用可以浏览文档

代码⽰例:在窗⼝中设置⼀个按钮,当点击"按钮"时关闭"窗⼝".
在这里插入图片描述

如何知道QPushButton有个clicked信号,Widget有一个close槽。

2.2 文档查询

这些都是可以从文档里面查询的,示例:
在这里插入图片描述

3.自定义信号和槽

3.1 自定义槽

自定义槽示例:这个函数需要在widget.h中声明一下
在这里插入图片描述
那么还有没有更快的方式? 兄弟,有的有的,像这样的方式还有…
图形化操作,直接就是一个拖拽,按照图片中操作,就可以直接生成一个函数。
在这里插入图片描述
.h文件中会自动生成函数声明;
在这里插入图片描述

然后我们对函数进行编写即可:效果是一样的
在这里插入图片描述
其实这是通过函数名来实现自动连接,当函数名符合规则后,QT就能自动把信号和槽连接,规则也十分简单on_ObjectName_信号名。

3.2 自定义信号

所谓的QT信号,本质上也是一个函数,但是信号则是一类比较特殊的函数,我们只需要写出函数声明,并告诉QT,这是一个信号即可,这个函数的定义,是QT编译过程中自动生成的。
⾃定义信号函数书写规范
(1)⾃定义信号函数必须写到"signals"下;
(2)返回值为void,只需要声明,不需要实现;
(3)可以有参数,也可以发⽣重载

在这里插入图片描述
在这里插入图片描述
信号创建后需要发射,如果是内置类型,可以自行触发,QT中内置了关键字emit去触发自定义信号。

3.3 带参数的信号和槽

Qt 的信号和槽也⽀持带有参数,同时也可以⽀持重载.
此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表⼀致.
此时信号触发,调⽤到槽函数的时候,信号函数中的实参就能够被传递到槽函数的形参当中.

在这里插入图片描述
QT中如果要让某个类使用信号槽,则必须在类的最开始,写下Q_OBJECT宏
在这里插入图片描述

4. 信号和槽的断开

使用disconnect函数即可断开,参数和connect一致。

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClick);
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{this->setWindowTitle("修改标题");qDebug()<<"handleClik1";
}void Widget::handleClick2()
{this->setWindowTitle("修改标题2");qDebug()<<"handleClik2";
}void Widget::on_pushButton_2_clicked()
{//1.先断开pushbutton的信号槽disconnect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClick);//2.重新绑定信号槽connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClick2);}

相关文章:

QT开发(6)--信号和槽

这里写目录标题 1. 信号和槽概述信号的本质槽的本质 2. 信号和槽的使用2.1 连接信号和槽2.2 文档查询 3.自定义信号和槽3.1 自定义槽3.2 自定义信号3.3 带参数的信号和槽 4. 信号和槽的断开 1. 信号和槽概述 在Qt中&#xff0c;⽤⼾和控件的每次交互过程称为⼀个事件。⽐如&quo…...

Linux部署DHCP服务脚本

#!/bin/bash #部署DHCP服务 #userli 20250319#检查是否为root用户 if[ "$USER" ! "root" ] thenecho "错误&#xff1a;非root用户&#xff0c;权限不足&#xff01;"exit 0 fi#配置网络环境 read -ep "请给本机配置一个IP地址(不…...

Dervy数据库

Derby 和 Sqlite 数据库都是无需安装的数据库 Derby 和 Sqlite 数据库的配置与使用_derby sqlite-CSDN博客 Derby数据库简明教程_原味吐司-腾讯云---开发者社区 下载 对于jdk1.8及以上 Apache Derby 10.14.2.0 Release 进入bin 找到 启动服务端 进入bin目录 实际上是启…...

Pythonic编程设计风格解析

Python 作为一种“优雅”、“简洁”、“明确”的编程语言&#xff0c;自诞生以来便以其极强的可读性和简洁的语法风靡全球。然而&#xff0c;真正掌握 Python 并不仅仅是会写 Python 代码&#xff0c;更在于是否写出了Pythonic 风格的代码。什么是 Pythonic&#xff1f;Guido v…...

优化 SQL 语句方向和提升性能技巧

优化 SQL 语句是提升 MySQL 性能的关键步骤之一。通过优化 SQL 语句,可以减少查询时间、降低服务器负载、提高系统吞吐量。以下是优化 SQL 语句的方法、策略和技巧: 一、优化 SQL 语句的方法 1. 使用 EXPLAIN 分析查询 作用:查看 SQL 语句的执行计划,了解查询是如何执行的…...

Json的应用实例——cad 二次开发c#

以下是一个使用AutoCAD C#.NET API实现你需求的示例代码&#xff0c;代码实现了提示用户选择一个实体&#xff0c;将一些字符串变量及其对应的值组成JSON格式数据存储到实体的扩展数据&#xff08;XData&#xff09;中&#xff0c;并在弹出窗口中显示该实体的所有扩展数据信息。…...

[AI速读]CHISEL vs. SystemVerilog:用RISC-V核心对比两种硬件设计语言

在硬件设计领域,选择合适的语言对开发效率、维护成本和最终性能都至关重要。最近,一项研究对比了两种硬件描述语言——CHISEL(基于Scala的嵌入式语言)和传统的SystemVerilog,它们分别实现了同一款RISC-V核心(SweRV-EL2)。以下是关键发现和结论。 为什么选择CHISEL? CHI…...

颠覆者的困局:解构周鸿祎商业哲学中的“永恒战争”

引言&#xff1a;被误解的破坏者 在北京海淀区知春路银谷大厦的某间会议室里&#xff0c;周鸿祎用马克笔在白板上画出一个巨大的爆炸图案——这是2010年360与腾讯开战前夜的战术推演场景。这个充满硝烟味的瞬间&#xff0c;恰是《颠覆者》精神内核的完美隐喻&#xff1a;在中国…...

免费送源码:Java+springboot+MySQL 房屋租赁系统小程序的设计与实现 计算机毕业设计原创定制

目 录 摘要 1 1 绪论 1 1.1选题意义 1 1.2开发现状 1 1.3springboot框架介绍 1 1.4论文结构与章节安排 1 2 房屋租赁系统小程序系统分析 3 2.1 可行性分析 3 2.1.1 技术可行性分析 3 2.1.2 经济可行性分析 3 2.1.3 法律可行性分析 3 2.2 系统功能分析 3 2.2.1 功…...

【计算机网络原理】选择题+简答题

文章目录 选择题网络基础IP网络拓扑 OSI七层模型协议HDLCTCP/IP 交换技术网络安全数字签名 算法与策略 简答题UDPTCP 选择题 网络基础 下列域名中&#xff0c;属于国际顶级域名的是&#xff08;&#xff09; A. us B. tom C. edu D. int 下列关于光纤传输介质的叙述中错误的是…...

个人学习编程(3-22) leetcode刷题

连续子数组&#xff1a;&#xff08;难&#xff09; 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。 需要理解的知识&a…...

基于python+django的酒店预定网站-酒店管理系统源码+运行步骤+课程学习

该系统是基于pythondjango开发的酒店预定管理系统。适用场景&#xff1a;大学生、课程作业、毕业设计。学习过程中&#xff0c;如遇问题可在github给作者留言。共同学习技术 演示地址 前台地址&#xff1a; http://hotel.gitapp.cn 后台地址&#xff1a; http://hotel.gitapp…...

Spring 6: 3容器-Ioc

3、容器&#xff1a;IoC IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容…...

【漫话机器学习系列】154.岭回归(Ridge Regression)

岭回归&#xff08;Ridge Regression&#xff09;详解 1. 引言 岭回归&#xff08;Ridge Regression&#xff09;是一种改进的线性回归方法&#xff0c;它通过引入正则化项来解决普通最小二乘法&#xff08;OLS, Ordinary Least Squares&#xff09;可能遇到的多重共线性问题…...

wsl2配置xv6全解(包括22.04Jammy)

文章目录 获取xv6源代码Ubuntu20.04 Version安装指令成功测试参考MIT2021年官方文档 24.04 Version安装指令成功测试参考MIT2024年官方文档 Ubuntu 22.04没有官方文档&#xff1f; 配置大体流程1. 卸载原本qemu&#xff08;如果之前安装了&#xff09;2. clone qemu官方源代码&…...

并查集——108. 冗余连接

108. 冗余连接 题目描述 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图: 现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图: 先请你找出冗余边,删除后…...

初识XXL-JOB分布式任务调度

XXL-JOB架构分析 设计思想 将调度行为抽象形成"调度中心"公共平台&#xff0c;而平台自身并不承担业务逻辑&#xff0c;"调度中心"负责发起调度请求。 将任务抽象成分散的JobHandler&#xff0c;交由"执行器"统一管理&#xff0c;"执行器…...

第29章:Service Mesh概念与Istio架构解析

第29章:Service Mesh概念与Istio架构解析 作者:DogDog_Shuai 阅读时间:约30分钟 难度:高级 目录 1. 引言2. Service Mesh基础概念3. Istio架构详解4. Istio核心功能5. Istio部署与配置6. 服务治理实战...

AI 核心技术教程:LLM、Text Embedding、Speech2Text、Moderation、TTS

AI 核心技术教程&#xff1a;LLM、Text Embedding、Speech2Text、Moderation、TTS 引言 随着人工智能的快速发展&#xff0c;NLP&#xff08;自然语言处理&#xff09;、语音识别、内容审核等技术正在重塑各个行业。本教程将详细介绍 大语言模型&#xff08;LLM&#xff09;、…...

【数据结构进阶】位图

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 一、位图的概念与结构 二、位图的实现 1. 结构定义 2. 构造函数 3. 三大接口实现 set unset test 总代码 4. 测试 三、 标准库的…...

[极客大挑战 2019]BabySQL—3.20BUUCTF练习day4(3)

[极客大挑战 2019]BabySQL-3.20BUUCTF练习day4(3) 做题过程 打开是以下页面&#xff08;前几天有它的第一版和第二版出现&#xff09;输入1’ 回显以下内容&#xff08;还是字符型以单引号闭合&#xff0c;因为有报错信息回显&#xff09; 输入1 order by 4%23回显成这个 被过…...

`sscanf` 和 `scanf` 的区别

sscanf 和 scanf 都是 C 语言中用于从字符串中读取格式化输入的函数&#xff0c;但它们的主要区别在于输入源的不同。 1、### scanf scanf 函数用于从标准输入&#xff08;通常是键盘&#xff09;读取格式化的输入。它的原型如下&#xff1a; int scanf(const char *format, .…...

JVM 学习前置知识

JVM 学习前置知识 Java 开发环境层次结构解析 下图展示了 Java 开发环境的层级关系及其核心组件&#xff0c;从底层操作系统到上层开发工具&#xff0c;逐步构建完整的开发与运行环境&#xff1a; 1. 操作系统&#xff08;Windows, MacOS, Linux, Solaris&#xff09; 作用&…...

数智读书笔记系列021《大数据医疗》:探索医疗行业的智能变革

一、书籍介绍 《大数据医疗》由徐曼、沈江、余海燕合著&#xff0c;由机械工业出版社出版 。徐曼是南开大学商学院副教授&#xff0c;在大数据驱动的智能决策研究领域颇有建树&#xff0c;尤其在大数据驱动的医疗与健康决策方面有着深入研究&#xff0c;曾获天津优秀博士论文、…...

Oracle 常用语法汇总

系列文章目录 本文对Oracle 常用的语法进行汇总 文章目录 系列文章目录一、Oracle 表&表字段操作&#xff1a;1.1 DDL语句(数据定义语言)Create、Alter、Drop、Truncate&#xff1a;1.1.1 建表&#xff1a;建表&#xff1a;注释COMMENT :表中字段的约束&#xff1a;表中字…...

解决python配置文件类configparser.ConfigParser,插入、读取数据,自动转为小写的问题

配置类 [Section1] Key_AAA Value[Section2] AnotherKey Value默认情况下&#xff0c;ConfigParser会将ini配置文件中的KEY&#xff0c;转为小写。 重载后配置类&#xff1a; 继承类从configparser.ConfigParser改为configparser.RawConfigParser重载方法optionxform&#…...

第一天 UnityShader的结构

Shader初学者的学习笔记 第一天 Unity Shader的结构 文章目录 Shader初学者的学习笔记前言一、Unity Shader结构二、Unity Shader结构解析① Properties② Tags③ RenderSetup(可选状态)④ Name⑤ [Tags]⑥ [RenderSetup]⑦ 顶点着色器和片元着色器的代码 (Unity最聪明的孩子)…...

什么是 BA ?BA怎么样?BA和BI是什么关系?

前几天有朋友在评论区提到了BA这个角色&#xff0c;具体是干什么的&#xff0c;我大概来说一下。 什么是BA BA 英文的全称是Business Analyst&#xff0c;从字面上意思就是商业分析师&#xff0c;做过商业智能BI项目的应该比较了解。实际上以我个人的经验&#xff0c;BA 的角…...

Jmeter旧版本如何下载

1.Jmeter最新版本下载位置 https://jmeter.apache.org/download_jmeter.cgi2.Jmeter旧版本下载位置 https://archive.apache.org/dist/jmeter/binaries稳定版本&#xff1a;5.4.1...

Python帕累托图(Pareto Chart): 从数据排序到决策优化

帕累托图&#xff08;Pareto Chart&#xff09;是一种基于80/20法则的经典数据可视化工具&#xff0c;广泛应用于质量管理、项目管理、业务分析等领域。本文将从其原理、构成、实现方法到应用场景进行全面解析&#xff0c;并附Python代码示例。 一、帕累托图的定义与起源 帕累…...