官网地址:https://doc.qt.io/qt-5/signalsandslots.html

0. 简介

slot是连接多个object的一种方法,很多别的框架都是使回调函数,但是QT中使用SLOT,相对与回调来说,不必考虑传入参数的类型匹配等问题。我们可以认为SLOT是一个函数,它可以被Signal激活,同时连接两个object。Qt’s signals and slots mechanism ensures that if you connect a signal to a slot, the slot will be called with the signal’s parameters at the right time.

1. 机制

  1. 任何继承自QObject或者其子类(e.g., QWidget) 的类都可以包含 signals and slots。
  2. Signals are emitted by objects when they change their state in a way that may be interesting to other objects. This is all the object does to communicate. It does not know or care whether anything is receiving the signals it emits.
  3. You can connect as many signals as you want to a single slot, and a signal can be connected to as many slots as you need. It is even possible to connect a signal directly to another signal. (This will emit the second signal immediately whenever the first is emitted.)

2. example

一个常见的C++工程如下:

class Counter
{public:Counter() { m_value = 0; }int value() const { return m_value; }void setValue(int value);private:int m_value;
};

一个继承自QObject的类的写法如下:

#include <QObject>class Counter : public QObject
{Q_OBJECTpublic:Counter() { m_value = 0; }int value() const { return m_value; }public slots:void setValue(int value);signals:void valueChanged(int newValue);private:int m_value;
};

这个类的状态可以被激发的信号valueChanged()改变, 并且它有slot可以让其他的function通过这个slot发送这个激活的信号。
它的slot为void setValue(int value);,下面一个它的可能实现。在这个实现中我们可以看到有一行为emit valueChanged(value);,这一句就是可以发送valuechanged(value)这个signal

void Counter::setValue(int value)
{if (value != m_value) {m_value = value;emit valueChanged(value);}
}

下面我们通过QObject::connect()这个函数来链接signalslot和两个object,用法如下:

Counter a, b;QObject::connect(&a, &Counter::valueChanged,&b, &Counter::setValue);a.setValue(12);     // a.value() == 12, b.value() == 12b.setValue(48);     // a.value() == 12, b.value() == 48

也就是说,a通过setValue这个slot链接b,并通过valueChanged这个signal通知b。
当a调用setvalue时,会激活valueChanged这个信号,那么b就会在setValue() slot中接收它,所以b会调用它的setValue.
Calling a.setValue(12) makes a emit a valueChanged(12) signal, which b will receive in its setValue() slot, i.e. b.setValue(12) is called. Then b emits the same valueChanged() signal, but since no slot has been connected to b’s valueChanged() signal, the signal is ignored.

在链接之后,我们也可以通过disconnect()来断开两个object之间的链接。

3. A Real Example

#ifndef LCDNUMBER_H
#define LCDNUMBER_H#include <QFrame>class LcdNumber : public QFrame
{Q_OBJECT
public:LcdNumber(QWidget *parent = nullptr);signals:void overflow();
public slots:void display(int num);void display(double num);void display(const QString &str);void setHexMode();void setDecMode();void setOctMode();void setBinMode();void setSmallDecimalPoint(bool point);
};
#endif

A slot is a receiving function used to get information about state changes in other widgets.
我们可以将不同的对象之间通过同一个信号不同的slot链接,这样就会调用不同的slot。

4. Signals And Slots With Default Arguments

如果我们要捕获一个对象销毁的信号:
The signatures of signals and slots may contain arguments, and the arguments can have default values.
比如说QObject的destory就是一个默认的信号:

void destroyed(QObject* = nullptr);

如果我们要捕获这个信号,我们可以这样实现,先自定义一个slot

void objectDestroyed(QObject* obj = nullptr);

然后把信号与对象进行链接,当sender销毁的时候,本对象会调用objectDestroyedslot:

connect(sender, &QObject::destroyed, this, &MyObject::objectDestroyed);

我们也可以直接使用默认的类来实现:这三种实现方式都可以

connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(Qbject*)));
connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed()));
connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed()));

但是下面这种不可以

connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed(QObject*)));

because the slot will be expecting a QObject that the signal will not send. This connection will report a runtime error.

QT工具 —— SignalsSlots相关推荐

  1. 1.4 Qt工具之Qt Linguist介绍

    转自:http://www.hellotongtong.com/Qt5base1/qtlinguist-intro.html 1.4 Qt工具之Qt Linguist介绍 ***[免费下载源码和PPT ...

  2. Pycharm创建QT工具

    安装工具包pyqt5和PyQt5-tools 添加环境变量 把上面变量添加到Paty中 Pycharm创建QT工具 先添加Qt-Designer应用 $FileDir$ $ ProjectFileDi ...

  3. pycharm 怎么快速生成文件夹结构_Pycharm配置Qt工具(ubuntu18.04)

    该文章主要记录如何在Pycharm中配置QtDesigner.Pyuic,使得能够很方便地在Pycharm中打开特定的ui文件进行修改并一键生成对应实际使用的py界面文件. 首先是一些基本的概念,QD ...

  4. QT学习——Qt工具介绍,Qt助手使用,第一个Qt程序,Qt字符串和字符编码

    一.Qt主要工具介绍 1)qt助手(assistant) 2)qt构建器(qmake) 3)qt设计师(designer) 4)qt转换器(uic) 5)qt资源编译器(rcc) 6)qt元对象编译器 ...

  5. Qt 工具类(05):在Qt里使用Lamda表达式

    文章目录 一.前言 二.什么是Lamda表达式? 2.1. Lambda 表达式的语法 2.2.Lambda函数的捕获列表 三.在Qt中使用Lambda表达式函数 3.1.信号连接Lambda 3.2 ...

  6. 【转】09.认识一下Qt用到的开发工具

    Qt 不是凭空产生的,它是基于现有工具链打造而成的,它所使用的编译器.链接器.调试器等都不是自己的,Qt 官方只是开发了上层工具.下面我们分几个部分讲解 Qt 使用到的工具链. GNU 工具集 在上个 ...

  7. QT使用多国语言及linguist工具使用

    在QT代码中使用不同语言.qm文件就能让程序转换成相应的语言.但必须有相应语言的字库支持才能转换成功,否则会出现乱码或空格.字体库有各种格式,需要放在/usr/lib/fonts目录下才行,下图圈出来 ...

  8. SM2 (含SM3、SM4)国密算法工具QT版,彻底搞懂sm2算法的使用

    网上有很多网友问算法SM2怎么使用?什么是压缩公钥和非压缩公钥?xB和yB这参数是什么?怎么使用SM2做加解密?如何签名和验签?有没有工具来验证下? 这里分享个自己用QT造的一个小工具,简单好用,同时 ...

  9. python界面设计资源库_python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法...

    PyQt5 Qt Designer (Qt设计师) PyQt5是对Qt所有类进行封装, Qt能开发的东西, PyQt都能开发. Qt是强大的GUI库之一, 用C++开发, 并且跨平台. PyQt双许可 ...

最新文章

  1. 在VMware Workstation上安装Ubuntu 16.04 Server操作系统
  2. java 反射代价_Java反射机制
  3. Java中文编码小结
  4. 太多脚本将会毁掉持续交付
  5. MYSQL ROOT权限丢失的解决方法
  6. 进入Ubuntu图形桌面的方法
  7. 块级元素与行级元素(内联元素)
  8. ubuntu16.04下面安装mongodb
  9. MyBatis动态SQL底层原理分析 与 JavaScript中的Date对象,以及UTC、GMT、时区的关系...
  10. android 应用自动重启,Android 应用崩溃后自动重启的方法
  11. shell脚本拼接中间带空格的两个变量成一个变量
  12. Redis进阶-高可用:集群
  13. rtp发送h264和h265
  14. Python 爬虫“学前班”!学会免踩坑!
  15. SecureCRT恢复默认字体
  16. 凸优化第六章逼近与拟合 6.1 范数逼近
  17. Centos系统设置
  18. 打印系统开发(5)——书脊
  19. html5实现对试题图片批改效果,类似盖章效果
  20. 数学模型——数学与人类文明的桥梁

热门文章

  1. 魔方的终结还原步数是20步
  2. 2020新榜大会:科技赋能,内容如何破界?
  3. 安卓开发——为自己的app快速集成聊天功能
  4. to be delete
  5. mercurymw305r虚拟服务器,水星MW305R(V1-V3)路由器桥接设置教程
  6. 怎么把电子版照片换底色?照片换底色最简单的方法
  7. 2022年考研「怪」象:国家分数线全面上升,部分院校的计算机类复试线却不增反降?...
  8. 怎样做出漂亮的excel数据分析表格
  9. Maven ‘parent.relativePath‘错误
  10. 单端怎么转差分信号_单端转差分信号电路详解