QT—信号与槽详解

article/2025/10/1 13:16:44

目录

一、什么是信号与槽

二、信号与槽的添加

1.添加槽方法

2.添加信号 

3.发送信号

4.信号与槽连接

三、连接类型

1.一对一

2.一对多

3.多对一

四、信号与槽断开连接 

1.断开一个对象的所有信号关联

2.断开指定信号的所有关联

3.断开指定接收者的所有关联

4.断开指定信号于槽的关联

五、信号与槽机制的优越性


一、什么是信号与槽

    信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。
    信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号。发射信号使用Qt的emit关键字。定义信号使用QT的signals关键字

定义信号,如:

signals:void testFun(QString& str); //信号不能也无需实现

 发射信号,如:

void fun(){QString str="就是这个感觉";emit testFun(str);       
}

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

    声明三个槽方法,如:

private slots:void testFun1(QString& str);void testFun2();void testFun3();

二、信号与槽的添加

1.添加槽方法

1.1通过ui设计页面添加槽方法

在ui设计页面中,右击控件、选解“转到槽”即可添加为控件添加相应的槽方法,并与信号关联

1.2手动添加槽方法 

 按“on_对象名_事件名”的格式手动添加槽方法,按这种格式添加的槽方法可以自动与单击时发射的 clicked() 信号连接。

private slots:void on_whBtn_clicked();void on_zgBtn_clicked();void on_sjBtn_clicked();    //自动连接 on_对象名_信号名

以上两种方式都可以自动的将槽方法与信号连接,但如果是自定义的槽方法则需要使用connect函数连接 

2.添加信号 

 关键字signals定义一个信号,信号不能也无需实现,并且返回值是void,信号与槽方法都可以携带参数,但是槽方法的参数类型必须是信号参数类型保持一致或者少于信号参数

signals:void Commeon(QString& str); //信号不能也无需实现,且返回值是void

3.发送信号

 使用emit关键字发送信号 。我们可以在任何地方使用emit关键字发送信号,包括在槽方法内

void MainWindow::on_whBtn_clicked()
{QString str="武汉";emit Commeon(str);
}void MainWindow::on_zgBtn_clicked()
{QString str="中国";emit Commeon(str);
}void MainWindow::on_sjBtn_clicked()
{QString str="世界";emit Commeon(str);
}

4.信号与槽连接

在构造函数中,通过connect将信号与定义的槽方法绑定起来 

QMetaObject::Connection QObject::connect(
const QObject *sender, //信号发送者
const char *signal, //发送的信号
const QObject *receiver, //信号接收者
const char *method, //表示与信号连接的方式的字符串,可以是槽或信号
Qt::ConnectionType type = Qt::AutoConnection //连接方式,默认自动连接)

    常用格式:connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

    信号使用SIGNAL,对于槽则使用SLOT,用它们将函数的原型包围起来即可。注意connect方法采用SIGNAL()及SLOT()时,这里的函数原型只能写出类型,不能有任何参数名,否则连接将会失败。

    例如

connect(this,SIGNAL(Commeon(QString&)),this,SLOT(CommeonGuys(QString&)));

同时信号与槽连接方式:

  1. Qt::AutoConnection:(默认连接方式)自动方式,由系统自动选择连接方式。
  2. Qt::DirectConnection:直接方式,信号发射时,立即调用槽。
  3. Qt::QueuedConnection:队列方式,信号发射时产生一个事件进入队列,事件被处理时槽才能调用。
  4. Qt::BlockQueuedConnection:阻塞队列方式,信号发射时产生一个事件进入队列,然后当前线程进入阻塞状态,直到事件处理完毕,若接收方位于发送信号的线程中,则程序会死锁,故此连接方式仅用于多线程。

 也可以不使用SIGNAL和SLOT,直接信号和槽的地址。

connect(this,&MainWindow::Common,this,&MainWindow::CommonGuys);

    信号可以看做是特殊的函数,需要带括号,可带参数,信号无需实现也不能实现。槽函数需要带括号,有参数时还需要指明参数。当信号和槽函数带有参数时,在 connect()函数里,要写明参数的类型。信号的参数需与槽的参数列表一致,允许比槽参数多。如果不匹配或参数过少,会出现编译错误或运行错误。在使用信号与槽的类中,必须在类的定义中加入宏 Q_OBJECT。当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样。只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。 

三、连接类型

1.一对一

声明两个信号signal1、signal2 和一个槽方法slot( ),将信号signal1与信号signal2相连,信号signal2与槽方法slot( )相连

signals:void signal1();void signal2();
private slots:void slot();

槽方法实现

void MainWindow::slot()
{qDebug()<<"我爱QT编程";
}

在构造函数中将信号与信号,信号与槽方法相连

connect(this,SIGNAL(signal1()),this,SIGNAL(signal2()));
connect(this,SIGNAL(signal2()),this,SLOT(slot()));

当发送signal1时,运行结果

2.一对多

声明一个信号和多个槽方法 

signals:void comeon(QString&str);
private slots:void comeon1();void comeon2();void comeon3();

槽方法实现 

void MainWindow::comeon1()
{qDebug()<<"我爱编程";
}void MainWindow::comeon2()
{qDebug()<<"我爱QT";
}void MainWindow::comeon3()
{qDebug()<<"我爱QT编程";
}

在构造函数中将信号与槽方法连接

connect(this,SIGNAL(comeon(QString&)),this,SLOT(comeon1()));
connect(this,SIGNAL(comeon(QString&)),this,SLOT(comeon2()));
connect(this,SIGNAL(comeon(QString&)),this,SLOT(comeon3()));

运行结果

3.多对一

声明多个信号和一个槽方法

signals:void come1(QString& str);void come2(QString& str);void come3(QString& str);
private slots:void come(QString& str);

槽方法实现

void Dialog::come(QString& str)
{qDebug()<<str;
}

准备三个控件,每个控件的槽方法各发送一个信号

void Dialog::on_Btn1_clicked()
{QString str="我爱编程";emit come1(str);
}void Dialog::on_Btn2_clicked()
{QString str="我爱QT";emit come2(str);
}void Dialog::on_Btn3_clicked()
{QString str="我爱QT编程";emit come3(str);
}

在构造函数中连接信号与槽方法

connect(this,SIGNAL(come1(QString&)),this,SLOT(come(QString&)));
connect(this,SIGNAL(come2(QString&)),this,SLOT(come(QString&)));
connect(this,SIGNAL(come3(QString&)),this,SLOT(come(QString&)));

当点击不同按键时,执行结果

四、信号与槽断开连接 

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

1.断开一个对象的所有信号关联

disconnect(sender,0,0,0);
//等价于
sender->disconnect();

2.断开指定信号的所有关联

disconnect(sender,SIGNAL(signal()),0,0);
//等价于
sender->disconnect(SIGNAL(signal()));

3.断开指定接收者的所有关联

disconnect(sender,0,receiver,0);
//等价于
sender->disconnect(SIGNAL(signal()));

4.断开指定信号于槽的关联

disconnect(sender, SIGNAL(single1()), receiver, SLOT(slotFun())); 
//等价于:
disconnect(myConnection);	//myConnection为connect()的返回值

myConnection是使用connect函数时的返回值,可以先用一个变量保存这个返回值。

例如添加m_res变量用于保存connect( ) 返回值 

private:QMetaObject::Connect m_res;

使用connect时保存返回值

m_res = connect(this,SIGNAL(signal()),this,SLOT(slot()));

断开连接

disconnect(m_res);

五、信号与槽机制的优越性

  1. 信号与槽机制是类型安全的,相关联的信号与槽参数必须匹配
  2. 信号与槽是松耦合的,信号发送者不知道也不需知道接受者的信息。
  3. 信号与槽可以使用任意类型的任意数量的参数。

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

相关文章

Qt的信号与槽

引入 在GUI编程中&#xff0c;组件组件如何实现通信是核心的技术内容。 Qt使用了信号与槽的机制&#xff0c;为此Qt引入了一些关键字slots、signals、emit&#xff0c;这些都是Qt特有的关键字&#xff0c;然后这些关键字会被Qt的moc转换位标准的C语句。 Qt 的部件类中有一些已…

Linux下的QT信号和槽机制(二)

目录 1.基本知识点 2.信号机制 3.槽机制 4.元对象工具 5.信号和槽机制原理 &#xff08;1&#xff09;信号和槽机制 &#xff08;2&#xff09;信号和槽函数的关联 &#xff08;3&#xff09;信号和槽的断开 &#xff08;4&#xff09;信号和槽的优点 &#xff08;5&…

Qt信号与槽原理

Qt信号与槽原理 本文为原创文章&#xff0c;转载请注明出处&#xff0c;或注明转载自“黄邦勇帅(原名&#xff1a;黄勇) 本文出自本人原创著作《Qt5.10 GUI完全参考手册》网盘地址&#xff1a; https://pan.baidu.com/s/1iqagt4SEC8PUYx6t3ku39Q 《C语法详解》网盘地址&#…

Qt 之 信号槽机制及优缺点

1. Qt 信号槽机制 概念&#xff1a; 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽&#xff0c;实际就是观察者模式。当某个事件发生之后&#xff0c;比如&#xff0c;按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号&#xff08;signal&#xff09;。这种发出是…

【Qt】一篇全面的信号和槽函数机制总结

信号和槽函数机制 文章目录 信号和槽函数机制一、信号和槽机制简介二、【信号】&#xff08;2-1&#xff09;信号的发出&#xff08;2-2&#xff09;信号的处理 三、【槽函数】&#xff08;3-1&#xff09;带有默认参数的信号和槽函数&#xff08;3-2&#xff09;使用QObject::…

Qt: 信号与槽机制

一、信号和槽机制是什么&#xff1f; 1 Qt信号槽机制&#xff1a;是Qt的核心机制&#xff0c;它是Qt定义的一种对象间的通讯机制&#xff0c;且独立于标准C/C语言。 2 信号&#xff08;signals&#xff09;:当某个类对象发生内部改变时&#xff0c;发射“信号”随后与关联的“槽…

Qt 信号和槽的机制(逻辑清晰的来说清楚信号和槽,呕心沥血之作)

Qt 信号和槽的机制 首先说声对不起&#xff0c;上次在PyQt5中写信号与槽&#xff0c;由于时间原因没有写完。有小伙伴留言说&#xff0c;希望把这章补全。所以&#xff0c;这是一篇迟来的文章&#xff0c;再次向大家说声抱歉。 一、桌面程序的结构 Qt的使用场景&#xff0c;…

Qt信号和槽机制emit的使用

1.相关概念&#xff1a; [1].信号&#xff08;Signal&#xff09;就是在特定情况下被发射的事件 [2].槽&#xff08;Slot&#xff09;就是对信号响应的函数。槽就是一个函数 [3].信号与槽之间的关联&#xff1a;是用 QObject::connect() 函数实现的&#xff0c;其基本格式是…

Qt信号和槽机制详解

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

Qt信号与槽机制

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

Qt --- 信号与槽

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

Qt中的信号和槽详解

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

QT笔记(一)

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

QT中信号和槽详解

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

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

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

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

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

TCP三次握手学习心得

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

使用wireshark抓取Tcp三次握手

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

TCP的三次握手、四次挥手

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

TCP三次握手原理

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