QT5开发之 信号与槽机制

2023-11-12

什么是信号与槽?

通俗理解信号就是发送的某种动作或特征的表现形式。就是响应信号的响应动作。

场景一:十字路口信号灯
在这里插入图片描述

场景二 PowerPoint按键
在这里插入图片描述

  • 连接函数:信号与槽的绑定。要考虑发送信号的实例特征与接收信号的实例特征。即哪个灯,什么动作,哪辆车这些问题。
  • 槽函数:信号的响应动作函数。
  • 对应关系:一对多,多对一,多对对,一对一。

信号与槽原理

信号与槽时用于对象之间的通信,是Qt的核心。

信号与槽不是C++标准代码,是QT特有的。会通过MOC(Mete-Objeci Compiler)进行重新编译为C++。

MOC编译流程

QT程序 C++语法文件(MOC得到)+源码C++文件 C++编译器 二进制文件

如何实现信号与槽机制?

实现方式

在这里插入图片描述

UI方式

利用控件信号与槽编辑器

步骤

  • 方式一:

新建控件->右键控件(转到槽)->选择信号->编辑槽函数;

  • 方式二:

新建控件->在信号与槽编辑器中选择发送者,信号,接收者和槽函数。

好处:操作方便
坏处: 看不到连接函数等详细步骤,处理复杂逻辑不适用。

代码方式(QT4)
QObject类:connect和disconnect 连接函数(QT4+QT5使用)

在这里插入图片描述
在QObject 类中有一个Public Function为connect函数
在这里插入图片描述
以及Static Public Menbers有大量重载的connect函数。

找到类与类的信号与槽函数(QT4+QT5使用)

如QWidget类,即界面类。
找到他发出的信号与他的槽函数入如下:
在这里插入图片描述

举例
connect(ui->pushButton_3,SIGNAL(clicked()),this,SLOT(close()));

解释:
发送方:ui->pushButton_3
发送信号:clicked();
接收对象: this即改界面QWidget类实例。
接收槽函数:close();//退出

总结

好处:信号与槽比较直观
坏处:
使用宏定义时,如果存在错误,在编译阶段不会报错,运行阶段会报错。

运行connect(ui->pushButton_3,SIGNAL(click()),this,SLOT(close()));clicked变成click就会报错。

使用宏定义时,宏定义里面的参数,不能加参数名,只能加参数类型。

运行connect(ui->pushButton_3,SIGNAL(clicked(bool check )),this,SLOT(close()));就会报错,改成connect(ui->pushButton_3,SIGNAL(clicked(bool)),this,SLOT(close()));就可以。

代码方式(QT5)
举例
connect(ui->pushButton_4,&QPushButton::clicked,this,&QWidget::close);
总结

好处:能完美解决QT4的问题
坏处:
信号和槽函数不能传参

解决:自定义槽函数,信号方式(针对QT5不能传参的问题)

改进一:将槽函数入口自定义:(QT4不支持)

connect(ui->pushButton_4,&QPushButton::clicked,this,&QtDesigner::customSlot);
void QtDesigner::customSlot(){
    this->close();
}
Lambda方式
    connect(ui->pushButton_5,&QPushButton::clicked,this,[=](){
        this->close();
    });
自定义方式
//自定义
connect(ui->pushButton_6,&QPushButton::clicked,this,[=](){
    emit customSignal();//触发信号
});   connect(this,&QtDesigner::customSignal,this,&QtDesigner::customSlot);

void QtDesigner::customSlot(){
    this->close();
}

其中ui实例中的定义包含:

signals:
    void customSignal(); //仅声名,未定义。
private slots:
    void customSlot();
总结自定义信号和槽函数的特征
  • 自定义信号函数
  1. 关键字前面不要加访问控制符private,public,protected
  2. 只需要声名,不需要定义。使用emit激活信号
  3. 返回类型为void
  • 自定义槽函数特征
  1. 关键字前面加访问控制符private,public,protected
  2. 需要声名和定义。
  3. 返回类型为void
函数指针方式
//函数指针
    void(QtDesigner::*closeui)() = &QtDesigner::customSlot;
    connect(ui->pushButton_7,&QPushButton::clicked,this,closeui);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT5开发之 信号与槽机制 的相关文章

随机推荐

  • arima 公式_小白快速上手数据分析1

    ARIMA时间序列分析 作用 ARIMA时间序列分析通常用于对单列具有时间序列的数据进行预测 例如销售量预测 股票收盘价预测等等 输入 单列数据序列的数据 例如每个月销售额 每天股票的价格 通常数据量为15 50 条 输出 对未来5 15
  • python3 asyncio 爬虫_爬虫高性能asyncio+ahttpio

    async实现协程 异步编程 我们都知道 现在的服务器开发对于IO调度的优先级控制权已经不再依靠系统 都希望采用协程的方式实现高效的并发任务 如js lua等在异步协程方面都做的很强大 python在3 4版本也加入了协程的概念 并在3 5
  • centos8 免登陆 免密码 多用户命令行 启动 ,以及 界面免密

    文章目录 修改 启动 service 临时切换 运行模式 永久 切换 运行模式 由于界面 不同 os 实现 不一样 所以 方法 估计 也都 不太通用 博主 还是 建议 大家 学习 linux 使用 命令行 进行学习 centos8 界面免密
  • 没什么用的代码-批量提取主目录下所有文件夹中pdf里面的图片

    一 提前安装 pip install pymupdf 二 实现的功能 读取一个文件夹及所有子文件夹中的pdf中的图片 判断图片存储条件 存储图片 三 代码 批量提取pdf文件中的图片 author Administrator import
  • Linux基础知识:认识一下内存

    1 什么是内存泄漏 对内存来说 如果之分配内存给程序 而程序使用完不进行释放 就会造成内存泄漏 甚至耗尽系统内存 需要调用free 或unmap 来释放这些内存 2 内存紧张 系统的处理机制 2 1 回收缓存 比如使用 LRU Least
  • 链表和数组的归并排序和快速排序

    链表的归并排序和快速排序 归并排序 Definition for ListNode public class ListNode int val ListNode next ListNode int x val x next null pub
  • 【Arthas】Arthas 导出堆栈信息

    1 概述 转载 Arthas 导出堆栈信息 2 开篇 arthas提供heapdump命令导出栈信息 类似jmap命令的heap dump功能 3 原理介绍 通过通过HotSpotDiagnosticMXBean的dumpHeap来导出栈参
  • Java面试题及答案整理汇总(2023最新版)

    前言 面试前还是很有必要针对性的刷一些题 很多朋友的实战能力很强 但是理论比较薄弱 面试前不做准备是很吃亏的 这里整理了很多面试常考的一些面试题 希望能帮助到你面试前的复习并且找到一个好的工作 也节省你在网上搜索资料的时间来学习 第1 10
  • 最长字符串匹配算法(KMP算法)

    include stdafx h include
  • k-means聚类算法总结

    聚类概念 聚类分析是在对象数据中发现对象之间关系 一般来说 组内相似性越高 组间相似性越大 则聚类的效果越好 k means概念 k means是一种无监督学习 它会将相似的对象归到同一类中 k means聚类的优缺点 优点 容易实现 缺点
  • vue hover事件

    Vue 框架中的 hover 事件可以通过在 HTML 标签上使用 v on mouseover 或者简写为 mouseover 来监听 例如
  • kubernetes

    Deploy资源 spec progressDeadlineSeconds 600 等待多少秒才能确定Deployment进程是卡住的 replicas 1 revisionHistoryLimit 10 指定保留多少旧的 ReplicaS
  • 因果3-因果图

    上一章我们介绍了潜在结果模型 这一章我们尝试从图的角度理解因果 大家都有图论基础 我就不多赘述图的基本概念了 在因果图里我们主要研究DAG directed acyclic graph 有向无环图 如图1 图1 一个DAG例子 Bayesi
  • 22道高级 React 面试题

    Q1 什么是虚拟DOM 虚拟DOM VDOM 它是真实DOM的内存表示 一种编程概念 一种模式 它会和真实的DOM同步 比如通过ReactDOM这种库 这个同步的过程叫做调和 reconcilation 虚拟DOM更多是一种模式 不是一种特
  • 【JavaDebug(二)】之Mysql语法异常java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; chec

    本文章由公号 开发小鸽 发布 欢迎关注 老规矩 妹妹镇楼 一 异常 一 异常描述 java sql SQLSyntaxErrorException You have an error in your SQL syntax check the
  • 【binkw32.dll下载】binkw32.dll缺失怎么办

    binkw32 dll文件对一些电脑软件 电脑游戏等程序的正常运行起到关键性作用 对于弹出缺少此类文件的弹窗 用户们很多时候也摸不着头脑 程序明明上次都能正常运行 突然就弹出缺少binkw32 dll文件的提醒窗口 通过小编此次编辑的文章
  • 修改DIV滚动条样式

    滚动条样式 div webkit scrollbar 滚动条整体样式 width 5px 高宽分别对应横竖滚动条的尺寸 height 5px div webkit scrollbar thumb 滚动条里面小方块 border radius
  • 剖析ElasticSearch的评分计算过程

    剖析elasticsearch的评分计算过程 es搜索结果是怎样的排序的 准备测试数据 搜索 剖析参数含义 结论 es搜索结果是怎样的排序的 es的排序准则的相关度 根据搜索 关键词 计算关键词在一个文档中的得分 得分越高结果越靠前 那么计
  • github服务器停止响应,如何解决“git pull,致命:无法访问'https://github.com ... \':服务器空回复”...

    当我使用Git命令 git pull 更新我的存储库时 消息如下 致命 无法访问 来自服务器的空回复 如何解决 git pull 致命 无法访问 https github com 服务器空回复 而且我尝试使用GitHub的应用程序 但此提醒
  • QT5开发之 信号与槽机制

    文章目录 什么是信号与槽 信号与槽原理 如何实现信号与槽机制 实现方式 UI方式 代码方式 QT4 QObject类 connect和disconnect 连接函数 QT4 QT5使用 找到类与类的信号与槽函数 QT4 QT5使用 举例 总