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

QT信号与槽机制详解

当信号发出后,被连接的槽函数会自动被回调,类似观察者模式,当发生了感兴趣的事件,某一个操作就会被自动触发。信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时Qt对应的窗口类会发出信号以此对用户的挑选做出反应。

信号的本质是事件,按钮单击、双击、窗口刷新、鼠标移动、按下、释放、键盘输入。槽的本质是类的成员函数,其参数可以是任意类型的,槽函数和普通C++成员函数几乎没有区别,可以是虚函数,也可以被重载,可以是公有、保护、  私有的,也可以被其他成员函数调用

唯一区别:槽可以与信号连接一起,每当和槽连接的信号被发射时,就会调用这个槽

在Qt中信号和槽函数都是独立的个体,本身没有任何联系,但由于某种特性需求可以将二者联系,在Qt中使用Qobject类中的connect函数进行关联,一个信号可以连接多个槽,一个槽也可以被多个信号连接,信号可以连接信号,此时前者的发射信号将导致后者的发射,信号的参数类型可以与槽的参数类型对应,信号的参数可以比槽的参数多,但不可以少,否则连接将失败

connect(const Qobject *sender,&QObject::signal, const Qobject *receiver,&QObject::method)

QT5的连接方式:信号和槽函数的参数是函数指针

QT服务器51用8266连,手机用app连,然后数据共享,手机和Qt都能控制单片机,Qt是把单片机的数据发给手机,把手机的控制命令给单片机

sender:发送信号的对象

signal:属于sender对象,信号是一个函数,这个参数的类型是函数指针,信号函数地址

receiver:信号接收者

method属于receiver对象,当检测到sender发出了signal信号,receiver对象调用method方法,信号发出之后的处理动作

sender和receiver两个指针必须被实例化了,否则connect不会成功

使用connect函数相当于做了信号处理动作的注册,method槽函数本质上一个回调函数,调用的时机是信号产生了以后,调用是Qt框架来执行的

connect函数可以有第五个参数第五个参数是连接类型,连接类型(Connection Type):指定信号和槽之间的连接方式,包括:AutoConnection(默认,自动选择最佳连接类型),DirectConnection(直接调用槽函数),QueuedConnection(排队调用槽函数),BlockingQueuedConnection(阻塞式排队调用),以及UniqueConnection(确保信号与槽之间的连接唯一)

一、标准信号与槽:Qt提供的标准类中都可以对某些特定事件进行检测,当用户操作后事件被触发类的内部就会产生对应的信号,这些信号都是Qt类内自带的

QPushButton的信号和槽函数

槽函数在Public slots中,信号函数是在signals中,如果没有signals,可以到基类查找是否有signals

使用:功能实现--点击按钮,窗口

[signal]void QAbstractButton::clicked(bool checked=false)//单击按钮发出的信号

[slot]bool QWidget::close()//关闭窗口的槽函数

Connect(ui->closewindow,&QPushButton::clicked,this,&MainWindow::close);

Connect()操作一般写在窗口的构造函数中,相当于在事件产生之前在qt框架中先进行注册

二、自定义信号与槽:需要将信号或槽函数放在一个自定义类中,自定义的类必须继承QObject或QObject的子类,在定义类中头文件加入QBject宏

信号本身是事件,只不过信号对应的函数只有声明,没有定义

自定义信号的要求:

1、信号是类的成员函数

2、返回值是void

3、信号用signals声明

如:class myWindow:public QObject{

       Q_OBJECT

    signals:

       void mysignal();//信号的参数作用是传递给槽函数

       void mysignal(int a);

自定义槽函数:信号的处理动作可以当作普通的成员函数使用,槽函数的参数是用来接收信号传递的数据,信号传递的数据就是信号的参数,信号函数和槽函数的参数类型需要进行匹配

信号函数:void my_slots(int a);

槽函数:void my_signals(int a);

信号的参数可以大于等于槽函数的个数

Public slots:
private slots:这样的槽函数不能在类外部调用

Protected slots:不能在类外部调用

Class clock:
public Object{Q_OBJECT;Signals:Void alarn();
}
个人类:
Class me:
Public Object{Q_OBJECT;
Public slots:Void DO(){
//槽函数
qDebug()<<”起床”;
}
}
QMainWindow类:
Class MainWindow:public QMainWindow{Q_OBJECT;
Public:Explicit MainWindow(QWidget *parent=nullptr);~MainWindow();
Public slots:Void m_trigger(){c->alarm();
}
Private:Ui::MainWindow *ui;me* m;my_clock* c; QMainWindow的构造函数:
MainWindow::MainWindow(QWidget *parent):QMainWindow(parent);Ui(new Ui::MainWindow){Ui->setupUi(this);m=new me;c=new my_clock();
//点击按钮发出的click信号,被QMainWindow接收,触发m_trigger槽函数
//m_trigger槽函数中触发my_clock发送alarm信号
//me接收到alarm信号,触发Do槽函数,打印起床做饭
connect(ui->button,&QPushButton::clicked,this,&MainWindow::m_trigger);
connect(c,&my_clock::alarm,m,&me::Do);
class Me:QObeject{Q_OBJECT;Public:void eat(){qDebug()<<“我要吃面”;}
void eat(QString s){qDebug()<<“我要吃”<<s;}signals:void hungry();void hungry(QString s);};me m;connect(m,SIGNAL(hungry()),m,slot(eat()));connect(m,SIGNAL(hungry(QString)),m,slot(eat(QString)));QT5:connect(&m,m_slot,&m,m_signal);//连接

信号与槽机制特点:

松耦合:

信号和槽之间不需要显式的引用或依赖关系。

发送信号的对象不需要知道哪些对象接收了该信号。

接收信号的对象也不需要知道信号是由哪个对象发出的。

灵活性:

一个信号可以连接多个槽,实现一对多的通信。

一个槽也可以响应多个信号,实现多对一的通信。

信号和槽的连接可以在运行时动态建立或断开。

类型安全:

Qt的信号和槽机制在连接时会检查参数类型是否匹配。

如果参数类型不匹配,连接将失败,并在运行时给出警告。

线程安全:

Qt的信号和槽机制支持跨线程通信,并保证线程安全。

信号可以在一个线程中发出,槽函数可以在另一个线程中执行。

三、实现方式

声明信号和槽:

在QObject派生类的头文件中,使用signals关键字声明信号。

使用slots关键字声明槽函数。

连接信号和槽:

使用QObject::connect函数将信号连接到槽。

连接可以在应用程序代码中的任何地方完成,将发出信号的对象和接收信号的对象作为参数传递。

发射信号:

当某种条件满足时,在合适的地方使用emit关键字调用信号。

信号函数可以像普通函数一样调用,并传递参数给槽函数。

相关文章:

QT信号与槽机制详解

当信号发出后&#xff0c;被连接的槽函数会自动被回调&#xff0c;类似观察者模式&#xff0c;当发生了感兴趣的事件&#xff0c;某一个操作就会被自动触发。信号是由于用户对窗口或控件进行了某些操作&#xff0c;导致窗口或控件产生了某个特定事件&#xff0c;这时Qt对应的窗…...

openGauss开源数据库实战二十二

文章目录 任务二十二 使用JDBC访问openGauss数据库任务目标实施步骤一、查看和设置隔离级别1.查看系统默认的隔离级别2.设置系统默认的隔离级别3.查看当前会话的隔离级别4.设置当前会话的隔离级别5.设置当前事务的隔离级别 二、读提交隔离级别测试三、可重复读隔离级别测试 任务…...

BurpSuite解决暴力破解时需要验证码问题

学习视频来自B站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记只是方便学习&#xff0c;以下内容只涉及学习内容&#xff0c;切莫逾越法律红线。 安全见闻&#xff0c;包含了各种网络安全&#xff0c;网络技术&#xff0c;旨在明白自己的渺小&#xff0c;知识的广博&a…...

WPF Combox使用 Text无法选择正确获取CHange后的Text

使用固定ComboxItem 无法通过 selectitem as object 来进行回去到 Content内的对香数据。那我只能这个样干&#xff1a; private void CBPaiweiLeixingSelect_Change(object sender, SelectionChangedEventArgs e){ ComboBox ThisBox sender as ComboBox;List<EDaxiaosuixi…...

【速览】设计模式(更新中)

目录 模式的历史设计模式是什么设计原则 SOLID1. 单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;2. 开闭原则&#xff08;Open/Closed Principle, OCP&#xff09;3. 里氏替换原则&#xff08;Liskov Substitution Principle, LSP&#xff09;4. 接…...

【stable diffusion部署】Stable Diffusion开源本地化的文生图图生图AI

前言 主要功能 文生图、图生图、图像修复、处理、合成 所有的AI设计工具&#xff0c;安装包、模型和插件&#xff0c;都已经整理好了&#xff0c;&#x1f447;获取~ 系统要求 windows 10、11系统&#xff0c;建议6G显存&#xff0c;NVIDIA显卡推荐12G显存&#xff0c;内存建…...

县城楼市踩踏式降价,或现2字头,率先回归月薪一平方的合理价格

在一二线城市都在欢呼10月份、11月份成交量回升&#xff0c;楼价回稳的时候&#xff0c;广东一些县城却先顶不住了&#xff0c;大举降价&#xff0c;显示出县城楼市房价率先回归月薪一平方的合理水平&#xff0c;这将对全国楼市产生巨大影响。 据了解这个县城的楼价此前较为稳定…...

计算机组成原理(七):二进制编码

二进制编码 二进制系统 二进制由两个数字 0 和 1 组成&#xff0c;适合数字电路中的高电平&#xff08;1&#xff09;和低电平&#xff08;0&#xff09;表示。在计算机内部&#xff0c;所有数据&#xff08;如数字、文本、图像、声音等&#xff09;最终都以二进制形式存储和…...

【GitHub分享】you-get项目

【GitHub分享】you-get 一、介绍二、安装教程三、使用教程四、配置ffmpeg五&#xff0c;卸载 如果大家想要更具体地操作可去开源网站查看手册&#xff0c;这里只是一些简单介绍&#xff0c;但是也够用一般&#xff0c;有什么问题&#xff0c;也可以留言。 一、介绍 you-get是一…...

论文概览 |《Sustainable Cities and Society》2024.12 Vol.116

本次给大家整理的是《Sustainable Cities and Society》杂志2024年12月第116期的论文的题目和摘要&#xff0c;一共包括52篇SCI论文&#xff01; 论文1 Enhancing road traffic flow in sustainable cities through transformer models: Advancements and challenges 通过变压…...

解决node.js的req.body为空的问题

从昨晚一直在试&#xff0c;明明之前用的封装的axios发送请求给其他的后端&#xff08;springboot&#xff09;是可以的&#xff0c;但昨天用了新项目的后端&#xff08;node.js&#xff09;就不行。 之前用了代理&#xff0c;所以浏览器发送的post请求不会被拦截&#xff0c;…...

Mysql学习笔记之安装

“工欲善其事&#xff0c;必先利其器”&#xff0c;这篇文章我们主要介绍Msql的安装方法。 1. 通过Docker方式安装Mysql 通过dock可以很方便的安装mysql&#xff0c;可以通过图形化界面配置各种参数&#xff0c;简介明了推荐使用dock方式安装&#xff0c;当然也可以使用命令方…...

将PDF流使用 canvas 绘制然后转为图片展示在页面上(二)

将PDF流转为图片展示在页面上 使用 pdfjs-dist 库来渲染 PDF 页面到 canvas 上&#xff0c;然后将 canvas 转为图片 安装 pdfjs-dist 依赖 npm install pdfjs-dist 或者 yarn add pdfjs-dist创建一个组件来处理 PDF 流的加载和渲染 该组件中是一个包含 PDF 文件的 ArrayBuffer…...

【深度学习】 零基础介绍卷积神经网络(CNN)

零基础介绍 卷积神经网络&#xff08;CNN&#xff0c;Convolutional Neural Network&#xff09;是深度学习中的一种神经网络&#xff0c;特别擅长处理图像和视频等有空间结构的数据。 假设我们在做一个“照片分类”的任务&#xff0c;比如判断一张照片中是猫还是狗。下面用一…...

Coze概述

### Coze概述 Coze&#xff08;中文名为扣子&#xff09;是由字节跳动开发的一个新一代AI应用开发平台&#xff0c;旨在让用户轻松创建各种AI驱动的应用和聊天机器人&#xff0c;无论用户的编程经验如何。以下是Coze的一些关键特性和功能&#xff1a; #### 关键特性 - **无代…...

康佳Android面试题及参考答案(多张原理图)

JVM 内存分布和分代回收机制是什么? JVM 内存主要分为以下几个区域。 堆(Heap)是 JVM 管理的最大的一块内存区域,主要用于存放对象实例。所有线程共享堆内存,在堆中又分为年轻代(Young Generation)和老年代(Old Generation)。年轻代又分为 Eden 区和两个 Survivor 区(…...

2022 年 3 月青少年软编等考 C 语言四级真题解析

目录 T1. 拦截导弹思路分析T2. 神奇的数列思路分析T3. 硬币思路分析T4. 公共子序列思路分析T1. 拦截导弹 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的…...

关于24年408真题的疑问

45.某计算机按字节编址&#xff0c;采用页式虚拟存储管理方式&#xff0c;虚拟地址和物理地址的长度均为32位&#xff0c;页表项的大小为4字节&#xff0c;页大小为4MB。虚拟地址结构如下&#xff1a; 这一道题如果不细想的话&#xff0c;其实是可以做对的&#xff0c;毕竟数字…...

【容器】k8s学习笔记基础部分(三万字超详细)

概念 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应用程序定义资源使…...

dayjs(2kb)和momentjs(70kb)关系详述及项目中如何选择讲解

关系 API&#xff1a;Day.js被设计为Moment.js的极简替代品&#xff0c;其API和用法与Moment.js几乎完全一致。这使得开发者在两者之间进行切换时&#xff0c;学习成本极低。 理念&#xff1a; Moment.js是一个大而全的时间日期库&#xff0c;提供了丰富的日期时间操作方法&am…...

MLOps实践指南:让AI模型持续交付

在人工智能技术日益渗透到各行各业核心业务的今天&#xff0c;一个严峻的现实是&#xff1a;大量机器学习模型在实验室里表现优异&#xff0c;却止步于概念验证阶段&#xff0c;难以稳定、高效地部署到生产环境。对于软件测试从业者而言&#xff0c;传统的测试方法与工具在应对…...

抢答器软件哪家强?五款抢答器软件全方位深度评测

在知识竞赛、企业培训、团队建设等活动中&#xff0c;一套高效、公平、稳定的抢答器软件是活动成功的关键。面对市场上琳琅满目的产品&#xff0c;如何选择成为许多组织者的难题。本文将从实际应用出发&#xff0c;对五款主流的抢答器软件进行深度评测&#xff0c;涵盖功能、性…...

解决游戏控制器兼容性难题:ViGEmBus驱动全攻略

解决游戏控制器兼容性难题&#xff1a;ViGEmBus驱动全攻略 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 问题诊断篇&#xff1a;游戏控制器兼容性痛点分析…...

实战利器:基于快马平台为你的车辆检测项目定制专属labelimg标注工具

在AI项目开发中&#xff0c;数据标注往往是决定模型效果的关键环节。最近我在做一个车辆检测项目时&#xff0c;发现通用的标注工具无法满足特定需求&#xff0c;于是尝试用InsCode(快马)平台快速定制了一个专属的labelimg工具。整个过程比想象中顺利&#xff0c;分享几个实战要…...

Spring Boot 远程调试终于来了!IntelliJ IDEA 新版支持「无 Agent」远程调试

推荐阅读 IDEA 官宣全新AI CLI:Gemini大模型免费用! IDEA 2026.1 EAP 4 发布:新特性太丝滑了! IDEA 官宣:终于可以爽用Cursor了! IDEA 这个骚操作,连 VS Code 都跟不上! IDEA 这个测试接口的好工具,效率 提升 10x 这些 IDEA 技巧没用上,你可能少了一大半摸…...

免费开源音频转换工具fre:ac完整指南:跨平台多格式转换与CD抓取终极教程

免费开源音频转换工具fre:ac完整指南&#xff1a;跨平台多格式转换与CD抓取终极教程 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac fre:ac是一款功能强大的免费开源音频转换工具&#xff0c;支持Windo…...

3步解决视频转PPT难题:智能幻灯片提取工具全攻略

3步解决视频转PPT难题&#xff1a;智能幻灯片提取工具全攻略 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 在数字化学习与办公场景中&#xff0c;从视频中提取PPT内容一直是效率瓶…...

SILERGY矽力杰 SY81103ABT NA DC-DC电源芯片

特性 内部MOSFET低导通电阻:顶部80m2&#xff0c;底部40mO 宽输入电压范围:4.5V~18V 最高输出电流3A 1.5%0.6V参考电压 精确的EN阈值 SY81103和SY81103C采用脉冲频率调制(PFM)模式运行 SY81103E和SY81103B的强制连续导通模式(FCCM)操作 内部软启动限制浪涌电流 支持预偏置输出的…...

C语言新手避坑指南:math.h库函数参数检查与常见编译错误解决

C语言新手避坑指南&#xff1a;math.h库函数参数检查与常见编译错误解决 刚接触C语言的开发者在使用math.h库时&#xff0c;往往会遇到各种"坑"——从莫名其妙的计算结果到令人困惑的编译错误。这些问题看似简单&#xff0c;却可能让初学者浪费数小时调试时间。本文将…...

轻量化开源方案解放Alienware潜能:从硬件控制到场景革命

轻量化开源方案解放Alienware潜能&#xff1a;从硬件控制到场景革命 【免费下载链接】alienfx-tools Alienware systems lights, fans, and power control tools and apps 项目地址: https://gitcode.com/gh_mirrors/al/alienfx-tools 当你启动电脑却要等待臃肿的Alienw…...