Qt信号和槽机制emit的使用

article/2025/10/1 15:48:52

1.相关概念:

[1].信号(Signal就是在特定情况下被发射的事件

[2].槽(Slot)就是对信号响应的函数。槽就是一个函数

[3].信号与槽之间的关联:是用 QObject::connect() 函数实现的,其基本格式是:

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

//信号发出者,处理的信号, 信号接收者,处理动作方法(槽函数)。

注解:

[1].sender 是发射信号的对象的名称,
[2].signal() 是信号名称。信号可以看做是特殊的函数,需要带括号,有参数时还需要指明参数。

[3].receiver 是接收信号的对象名称,slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。

[4].SIGNAL SLOT Qt 的宏,用于指明信号和槽,并将它们的参数转换为相应的字符串。

使用时需注意:

[1].一个信号可以连接多个槽, 当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次执行,例如:

connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(addFun(int));

connect(spinNum, SIGNAL(valueChanged(int)), this, SLOT(updateStatus(int));

[2]. 多个信号可以连接同一个槽,

connect(ui->rBtnBlue,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(ui->rBtnRed,SIGNAL(clicked()),this,SLOT(setTextFontColor()));
connect(ui->rBtnBlack,SIGNAL(clicked()),this,SLOT(setTextFontColor()))

[3]. 一个信号可以连接另外一个信号

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

[5]. 在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT

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

2.自定义槽

可当作槽函数的:任意的成员函数,普通全局函数,静态函数。

槽函数需要和信号一致(参数列表,返回值)如果信号没有返回值,槽函数一定没有返回值。

【举例】:让按钮2点击一下,就能改变按钮上的文本。

[1].首先,在.h文件中声明:

[2]在.cpp文件对该函数进行定义:

[3]给按钮联结自定义的槽函数 mySlot:

connect(b2, &QPushButton::released, this, &MainWidget::mySlot);

[4].运行

3.自定义信号

1.信号必须有signals关键字来声明

2.信号没有返回值,但可以有参数。

3.信号就是函数的声明,只需声明,无需定义。

4.emit发射信号

emit是Qt关键字,像其他关Qt扩展一样,它也会被C++预处理器转换成标准的C++代码。

使用:在A中对B使用信号

主要步骤:信号的创建,槽函数的创建,A类信号和B类槽函数的联接和使用

***A类的cpp***
void A::Dome()
{B = new B;******//在这里要先将B类实例化******//信号与槽需要实例化对象******connect(this, SIGNAL(mySignal()), B, SLOT( BmySlot1()));***//将A类的信号和B类的槽函数链接起来***emit void AmySignal();***//发出信号***
}
***B类的cpp***
void B::BmySlot1()
{printf("hello world\n");***//实现***
}

【举例】

需求:有两个窗口:主窗口和子窗口,让主窗口的按钮能跳转到子窗口,子窗口的按钮能跳转到主窗口。

疑问点:从主窗口跳转到子窗口,因为主窗口中有子窗口对象。但是要在子窗口中显示主窗口,由于子窗口中没有主窗口的对象。也不能有,否则进入死循环,逻辑错误。

[1].在main函数中把主窗口MainWidget加入进程

int main(int argc, char *argv[])
{QApplication a(argc, argv); //创建一个QApplication类对象,有且只有一个应用程序对象!MainWidget w1;w1.show();return a.exec();}

[2].创建主窗口,在主窗口中创建一个按钮,并connect到槽函数

setWindowTitle("老大"); //给窗口命名。but3.setParent(this);but3.setText("切换到子窗口");but3.move(50,50);
connect(&but3, &QPushButton::released,this,&MainWidget::changeWin);
//在主窗口类中定义和声明槽函数MainWidget::changeWin
public: void changeWin();
void MainWidget::changeWin(){//子窗口显示w.show();//本窗口隐藏this->hide();
}

[3].创建子窗口,并让子窗口加入到主窗口。

创建子窗口文件widget.h/widget.cpp

在主窗口文件中声明子窗口

private: Widget w;

[4]在主窗口中处理子窗口信号

// 先给子窗口添加自定义信号:mySignal,并connect到主窗口的dealSub槽函数

connect(&w, &Widget::mySignal,this,&MainWidget::dealSub);

// mySignal():在子窗口中有申明信号函数:但是没有定义

signals:void mySignal(); //在子窗口中申明信号函数

// dealSub():在主窗口中申明和定义槽函数

public :void dealSub();//申明:

//在相关.cpp文件中定义

void MainWidget::dealSub(){w.hide();//子窗口隐藏show();  //本窗口显示
}

[5].在子窗口中添加按钮,并让其实现跳转到主窗口

1).在子窗口文件中添加按钮

b3.setParent(this); //通过setParent指定父级
b3.setText("返回上一级窗口");
b3.resize(200, 40);//设置按钮的大小
b3.move(200, 200);//以Qwidget左上角为(0, 0),移动按钮

2).给按钮信号connect子窗口的sendSlot槽函数。

connect(&b3, &QPushButton::clicked,this,&Widget::sendSlot);

3).在子窗口类中声明和定义槽函数

public:void sendSlot();

4).定义槽函数:

void Widget::sendSlot(){
emit mySignal(); //触发子窗口的mySignal()信号。
}
mySinal()函数子窗口中有申明,但没有一个具体实现,这是为何?

答案请看《自定义信号的定义规则第3条》

 


http://chatgpt.dhexx.cn/article/lHGXdRYd.shtml

相关文章

Qt信号和槽机制详解

Qt信号和槽机制详解 信号和槽是 Qt 特有的消息传输机制,它能将相互独立的控件关联起来。 举个简单的例子,按钮和窗口本是两个独立的控件,点击按钮并不会对窗口造成任何影响。通过信号和槽机制,我们可以将按钮和窗口关联起来&…

Qt信号与槽机制

一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起&…

Qt --- 信号与槽

信号与槽概述 信号与槽是 Qt 框架引以为豪的机制之一。所谓信号与槽,实际就是观察者模式(发布-订阅模式)。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没…

Qt中的信号和槽详解

一、背景介绍 信号和槽用于两个对象之间的通信。信号和槽机制是Qt的核心特征,也是Qt不同于其他开发框架的最突出特征。在GUI编程中,当改变了一个部件时,总希望其他部件也能了解到该变化。更一般来说,我们希望任何对象都可以和其他…

QT笔记(一)

学习目标: 总结学习的QT 学习内容: 1、 QT的一些固定格式 2、 控件和事件 3、 信号和槽 记录内容: 1、 QT的固定格式 (1) 引用头文件 自己创建的头文件用" "括起,eg: #include "mainwindow.h"QT提供的头文…

QT中信号和槽详解

一、QT中信号和槽的机制 1、贴图来理解信号和槽的关系 2、解释 (1)信号和槽是用于QT对象之间的通信,信号可以有某种动作触发,也可以直接由代码触发。 (2)槽也叫操函数,当完成了信号和槽的连接…

Qt核心特性之 —— 「信号(Signal)与槽(Slot)」机制

目录 1、Qt 与 Qt Creator简介: 2、关于引用头文件的一些事儿: 3、信号(Signal)与槽(Slot)机制: 3.1、一个小例子: 4、自定义信号与槽: 4.1、运行效果: 5、信号与槽的特性: 6、Qt 4…

三张图搞定TCP 握手、HTTPS、TLS加密过程

1. 抓包内容(WireShark) 2. 搞定握手、挥手、SSL加密过程 3. 消息内容(Charles) 之前看到写的比较好的文章,有文字详细叙述: TLS版本差异 https://zhuanlan.zhihu.com/p/27524995?utm_source协议解析 htt…

TCP三次握手学习心得

客户端A若要连接服务端B,首先A会向B发送一个连接请求,其中SYN1,ACK0,B为了告诉A成功收到了消息,则向A发送一个确认包,其中SYN1,ACK1,这时A收到之后又会向B发送一个确认收到确认包的确认包,SYN0,…

使用wireshark抓取Tcp三次握手

文章目录 wireshark的下载安装TCP协议段格式简单介绍确认应答机制介绍使用wireshark抓取TCP的三次握手 wireshark的下载安装 软件的下载可以直接去官网下载 wireshark,选择自己电脑适合的版本就行。 但是不咋推荐,原因是国外网站访问速度太慢&#xff…

TCP的三次握手、四次挥手

一、TCP的三次握手 第一次握手:你能和我建立连接吗,可以接受到我的数据吗。 SYN 1 ,seq x 第二次握手:可以建立连接,我接受到你的请求了,能接受到我的数据吗,你的数据是这个吗 SYN 1 &#…

TCP三次握手原理

在众多的网络协议中,TCP协议占据着举足轻重的地位,你知道什么是TCP协议吗? 一、TCP协议 TCP(Transmission Control Protoco)协议属于计算机网络体系中的运输层。运输层的任务是负责向主机中应用层进程之间的通信提供通用的数据传输服务。所以…

TCP三次握手及四次挥手过程中的异常处理

1. 消息丢失的情况: 总的原则: ACK不会重传,SYN和FIN报文段有最大重传次数。无论是SYN还是FIN,达到最大重传次数后对端若仍无响应则直接进入CLOSED状态。 1.1 三次握手过程的消息丢失: 正常的三次握手的流程&#x…

HTTPS 中 TLS 和 TCP 能同时握手吗?

HTTPS 中 TLS 和 TCP 能同时握手吗? 大家好,我是小林。 有位读者在面试的时候,碰到这么个问题: 面试官跟他说 HTTPS 中的 TLS 握手过程可以同时进行三次握手,然后读者之前看我的文章是说「先进行 TCP 三次握手&#…

TCP优化一:TCP 三次握手的优化

TCP 三次握手的性能提升 TCP 是面向连接的、可靠的、双向传输的传输层通信协议,所以在传输数据之前需要经过三次握手才能建立连接。 那么,三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上,在网络状态不佳、高并发或者遭遇 SYN 攻击…

TCP握手过程和挥手过程

TCP报文首部 源端口和目的端口,各占2个字节,分别写入源端口和目的端口;序号,占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号。例如,一段报文的序号字段值是 301 ,而携带的数据共有1…

TCP三次握手

TCP协议是传输层协议,是一种面向连接的传输控制协议,可以控制流量的传输。是一种可靠的传输,能够保证数据的完整性,有效性和有序性。 1.TCP建立连接(三次握手) 第一次握手:PC1发送SYN请求&…

TCP握手与挥手详解(附有图)

为什么不是4次握手 首先我们知道TCP是3次握手与4次挥手,为什么不是4次握手呢,因为其中握手请求同步过程中并不需要数据传输因此将两次合并为一次了。 我们需要掌握哪些标志量 SYN:请求同步标志,为1的时候为有效 ACK&#xff1…

为什么TCP需要握手

一、TCP握手流程 二、为什么不是4次握手 TCP的每次请求都是成对的,原则上应该是四次 【Client to Server】第一次SYN,seqx【Server to Client】第二次ACK,seqy,ackx1(没有携带数据的ACK不消耗序列号)【Se…

tcp_tw_recycle引起的TCP握手失败

背景 测试环境的一台Nginx服务器,最近一直被前端同事吐槽网络有问题,经常出现访问HTTP请求时超时,哪怕是静态文件也经常超时。 刚开始以为是公司网络抽风了,也就没放在心上,但持续了一个星期,而且复现率很…