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

article/2025/10/1 13:19:32

目录

1.基本知识点

2.信号机制

3.槽机制

4.元对象工具

5.信号和槽机制原理

(1)信号和槽机制

(2)信号和槽函数的关联

(3)信号和槽的断开

(4)信号和槽的优点

(5)实例过程


Linux下的QT安装及初步使用过程(一)

1.基本知识点

  • 信号和槽机制是QT的核心机制。
  • 信号和槽是一种高级接口,应用于对象之间的通信;
  • 信号和槽是QT自定义的一种通信机制,独立于标准的C/C++语言,要正确处理信号和槽,必须借助一个为moc的QT工具,是一个C++预处理程序,为高层次的事件处理自动生成需要的附加代码。

2.信号机制

  • 当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。
  • 只有定义这个信号的类以及派生类能够发射这个信号。
  • 当一个信号被发射时,与其相关联的槽将被立即执行,就像一个正常的函数调用一样。
  • 信号和槽机制完全独立于任何GUI事件循环。
  • 只有当所有的槽返回以后发射函数才返回。
  • 如果存在多个槽和某个信号相关联,当这个信号被发射的时候,这些槽将会一个接一个的执行,但是它们的执行顺序是随机的,不确定的,不能人为的指定哪个先执行,哪个后执行。

信号的声明是在头文件当中:例如以下的是三个信号:

signals(关键字):

        void mySignal();

        void mySignal(int x);

        void mySignal(int x,int y);

提示:其中的void表示不要从信号返回什么信息(是在头文件中声明,而不是在.cpp文件中)。

3.槽机制

  • 槽是普通的C++函数成员,可以被正常调用;
  • 很多信号可以与之相关联;
  • 当其关联的信号发被发射时,这个槽函数就会被调用;
  • 槽函数可以有参数,但是其参数不能缺省;
  • 槽函数与其他函数一样,有存取权限;该权限决定了谁能够与之相关联;

槽函数的三种类型:

  • public slots:意味着任何对象成员都可以将信号与之相连。
  • private slots:意味着只有类自己可以将信号与之相关联,适用于非常紧密的类。
  • protected slots:意味着当前类及其子类可以将信号与之连接。

声明格式:

public slots:

        void mySlot();

        void mySlot(int x);

        void mySlot(int x,int y);

4.元对象工具

  • 元对象编译器对C++文件中的类声明进行分析并产生用于初始化元对象的C++代码;
  • 元对象包含全部信号和槽的名字以及指向这些函数的指针。
  • 当使用moc读取C++源文件时,如果发现有Q_OBJECT宏声明的类,就会生成另一个C++源文件,新生成的文件中包含该类的元对象代码。
  • 比如有一个头文件mysignal.h,那么moc工具就会根据该文件自动生成一个名为“mysignal.moc.h”的C++源文件并将其提交给编译器。
  • 元对象代码是signal/slot机制所必须的;
  • 使用moc产生的C++源文件必须与类实现一起进行编译和连接,或者使用#include语句将其包含到类的源文件中。
  • moc并不扩展#include或者#define宏定义,只是简单地跳过所遇到的任何预处理指令。

5.信号和槽机制原理

(1)信号和槽机制

  • 信号和槽机制取代了凌乱的函数指针,并且信号和槽函数可以携带任意数量和类型的参数。
  • 从QObject或其子类派生的类都能够包含信息和槽。
  • 当对象改变其状态的时候,信号就由该对象发射(emit)出去。
  • 信号和槽关联关系的模式:
    • 一个信号和一个槽关联;
    • 一个信号和多个槽关联;
    • 多个信号和多个槽关联;

(2)信号和槽函数的关联

  • 当一个特定的事件发生时,一个信号被发射;
  • 槽是一个可以被调用的处理特定信号的函数;
  • 函数的定义如下:
    • bool QObject::connect(const QObject*sender,const char*signal,const QObject*receiver,const char*member)[static]
  • 其中:connect的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。如果发射者和接收者是同一个对象的话,接收者的参数可以省略。
  • 例如:将标签对象label和滚动条scroll,并且将valueChanage()信号与标签对象的setNum()相关联,携带了一个整形的参数,用于显示滚动条所处的位置的值。
    • QLabel*label=new QLabel;
    • QScrollBar*scroll=new QScrollBar;
    • QObject:connect(scroll,SIGNAL(valueChanage(int)),label,SLOT(setNum(int)));

(3)信号和槽的断开

bool QObject::disconnect(const QObject*sender,const char*signal,const QObject*receiver,const char*member)[static]

  • 断开与某个对象相关联的任何对象:
    • 方法一:disconnect(myObject,0,0,0);
    • 方法二:myObject->disconnect()
  • 断开与某个特定信号的任何关联:
    • 方法一:disconnect(myObject,SIGNAL(mySignal()),0,0)
    • 方法二:myObject->disconnect(SIGNAL(mySignal))
  • 断开两个对象的关联
    • 方法一:disconnect(myObject,0,myreceiver,0)
    • 方法二:myObject->disconnect(myreceiver)

其中0表示一个通配符,表示任何信号,任何接收对象和接收对象中的任何槽函数,但是发送者不能为0,其他参数可以。

(4)信号和槽的优点

  • 信号和槽机制是类型安全的;
  • 信号和槽宽松地联系在一起。

(5)实例过程

第一个文件:mysigSlot.h头文件

第二文件: mysigSlot.cpp

第三个文件:主函数文件

  

提示:如果出现以下报错,则需要对目录进行授权,然后进行root用户下金吃那个程序的编译。

第一步:生成工程文件demo01.pro

第二步:生成Makefile文件 

第三步:将demo01.pro工程文件中添加一点内容,这是由于版本问题导致的

 

第四步:生成可执行文件

 

第五:运行结果

 

 


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

相关文章

Qt信号与槽原理

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

Qt 之 信号槽机制及优缺点

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

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

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

Qt: 信号与槽机制

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

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

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

Qt信号和槽机制emit的使用

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

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 三次握手&#…