1. 信号和槽概述

> 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽,实际就是观察者模式(发布-订阅模式)。当某个`事件`发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。

1.1 信号的本质

信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时候Qt对应的窗口类会发出某个信号,以此对用户的挑选做出反应。

因此根据上述的描述我们得到一个结论:信号的本质就是事件,比如:

  • 按钮单击、双击
  • 窗口刷新
  • 鼠标移动、鼠标按下、鼠标释放
  • 键盘输入

那么在Qt中信号是通过什么形式呈现给使用者的呢?

  • 我们对哪个窗口进行操作, 哪个窗口就可以捕捉到这些被触发的事件。
  • 对于使用者来说触发了一个事件我们就可以得到Qt框架给我们发出的某个特定信号。
  • 信号的呈现形式就是函数, 也就是说某个事件产生了, Qt框架就会调用某个对应的信号函数, 通知使用者。

在QT中信号的发出者是某个实例化的类对象,对象内部可以进行相关事件的检测。

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

1.2 槽的本质

在Qt中槽函数是一类特殊的功能的函数,在编码过程中也可以作为类的普通成员函数来使用。之所以称之为槽函数是因为它们还有一个职责就是对Qt框架中产生的信号进行处理。

举个简单的例子:

女朋友说:“我肚子饿了!”,于是我带她去吃饭。

上边例子中相当于女朋友发出了一个信号, 我收到了信号并其将其处理掉了。

  • 女朋友 -> 发送信号的对象, 信号内容: 我饿了
  • 我 -> 接收信号的对象并且处理掉了这个信号, 处理动作: 带她去吃饭

在Qt中槽函数的所有者也是某个类的实例对象。

1.3 信号和槽的关系

在Qt中信号和槽函数都是独立的个体,本身没有任何联系,但是由于某种特性需求我们可以将二者连接到一起,相当于一个绑定,在Qt中我们需要使用QOjbect类中的connect函数进二者的关联。

QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection);
- 参数:- sender: 发出信号的对象- signal: 属于sender对象, 信号是一个函数, 这个参数的类型是函数指针, 信号函数地址- receiver: 信号接收者- method: 属于receiver对象, 当检测到sender发出了signal信号, receiver对象调用method方法,信号发出之后的处理动作// connect函数相对于做了信号处理动作的注册
// 调用conenct函数的sender对象的信号并没有产生, 因此receiver对象的method也不会被调用
// method槽函数本质是一个回调函数, 调用的时机是信号产生之后, 调用是Qt框架来执行的
// connect中的sender和recever两个指针必须被实例化了, 否则conenct不会成功
connect(const QObject *sender, &QObject::signal, const QObject *receiver, &QObject::method);

1.4 通过实例加深理解

现在要实现一个简单的功能,就说创建一个按钮,点击这个按钮关闭窗口

然后思考,这个功能的信号发出者,信号接受者,以及发出什么信号,接受信号后怎么做

  • 按钮: 信号发出者 -> QPushButton
  • 窗口: 信号的接收者和处理者 -> QWidget
  • 发出信号:被点击 -> clicked
  • 槽函数,即如何处理 -> close

现在我们来实现一下

在ui中添加一个button,取名为closeBtn

然后再Mainwindow.cpp 文件中

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
}MainWindow::~MainWindow()
{delete ui;
}

注意这条语句
connect(ui->closeBtn,&QPushButton::clicked,this,&MainWindow::close);
通过这条语句来实现绑定

  • 现在我们来运行一下

点击按钮,窗口关闭

这只是一个很简单的例子,用来帮助理解信号槽,希望对你有帮助。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

深入理解Qt信号槽机制相关推荐

  1. Qt信号槽机制-传递自定义数据类型(qRegisterMetaType)

    Qt信号槽机制-传递自定义数据类型qRegisterMetaType 前言 前言 通过Qt内置的数据类型进行信号与槽参数传递很方便:如果是自己定义的类型如果想使用signal/slot来传递的话,则没 ...

  2. Hello Qt——Qt信号槽机制源码解析

    基于Qt4.8.6版本 一.信号槽机制的原理 1.信号槽简介 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察 ...

  3. c++实现Qt信号槽机制

    信号槽机制的原理 信号槽是观察者模式的一种实现,或者说是一种升华: 一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: 一个槽就是一个观察者,通常就是在被观察的对象发生改变的时候-- ...

  4. Qt信号槽机制详解及案例

    目录 信号槽 标准信号槽 自定义信号槽 信号槽 信号槽是Qt框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signa ...

  5. c++模拟qt信号槽机制

    qt的信号槽原理:moc元对象编译器翻译头文件成moc文件,实现头文件中的信号的函数体和申明信号.槽的索引,加上一个qt_static_metacall的函数等等,然后在connect中的QObjec ...

  6. 学习QT之信号槽机制详解

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

  7. Qt的信号槽机制介绍

    Qt 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 Qt ...

  8. 【QT|趣谈】最详细的信号槽机制介绍!

    用最有趣的方式解释信号槽通讯机制 1 导语:信号槽的前世今生 2 QT的信号槽 2.1什么是信号槽? 2.2 用严谨的语言解释信号槽 3 信号槽实战 3.1 信号槽实例 4 信号槽plus 4.1 L ...

  9. Qt的信号槽机制介绍(含Qt5与Qt4的差异对比)

    转载地址: https://blog.csdn.net/nicai888/article/details/51169520 一 闲谈: 熟悉Window下编程的小伙伴们,对其消息机制并不陌生, 话说: ...

最新文章

  1. vim与gvim技巧大全
  2. Python高级教程-生成器
  3. Vue中使用vue-quil-editor富文本编辑器+el-upload实现带图片上传到SpringBoot后台接口
  4. c#和VB混用出现的错误
  5. Boost:在向量中打印值
  6. 专家的修炼之路 —— 德雷福斯模型 Dreyfus
  7. 【思考?】什么时候会触发这个策略呢?
  8. 保存的图数据丢失_锡柴自主刷写和备份共享数据文件使用介绍
  9. [Unity] GameFramework 学习记录 5
  10. 数据3分钟丨Databricks与Snowflake开撕;阿里云多款自研数据库支撑首个“100%云上双11”...
  11. Java微信运动步数排序设计_微信小程序仿微信运动步数排行-交互
  12. 一天学习一点之如何安装nodejs
  13. Net framework3.5本地镜像离线装
  14. C语言编程题:平方数
  15. c语言单片机程序设计例,51单片机C语言程序设计经典实例(第2版)
  16. Python数据可视化的3大步骤!
  17. maven本地仓库的更新
  18. 新能源汽车——EMC
  19. 直播核心圈从业者对淘宝直播12条判断
  20. 给朋友的简短独特的生日祝福语

热门文章

  1. C++异常的幕后10:_Unwind_与调用帧信息
  2. 学习高中竞赛究竟要花多少钱?北大保送生给你算了一笔账
  3. 咖喱函数(Curry Func)
  4. html作业心得体会,学习心得体会范文6篇
  5. Node——express模块中的req,res参数
  6. 307 Temporary Redirect 解决办法
  7. 如何禁止a标签跳转页面
  8. 【JAVA】贪吃蛇的初步实现(二)
  9. Daily Report 到底该写点什么?
  10. SpringBoot 自动配置之 Condition