QT工具 —— SignalsSlots
官网地址: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. 机制
- 任何继承自QObject或者其子类(e.g., QWidget) 的类都可以包含 signals and slots。
- 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.
- 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()
这个函数来链接signal
,slot
和两个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销毁的时候,本对象会调用objectDestroyed
slot:
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.4 Qt工具之Qt Linguist介绍
转自:http://www.hellotongtong.com/Qt5base1/qtlinguist-intro.html 1.4 Qt工具之Qt Linguist介绍 ***[免费下载源码和PPT ...
- Pycharm创建QT工具
安装工具包pyqt5和PyQt5-tools 添加环境变量 把上面变量添加到Paty中 Pycharm创建QT工具 先添加Qt-Designer应用 $FileDir$ $ ProjectFileDi ...
- pycharm 怎么快速生成文件夹结构_Pycharm配置Qt工具(ubuntu18.04)
该文章主要记录如何在Pycharm中配置QtDesigner.Pyuic,使得能够很方便地在Pycharm中打开特定的ui文件进行修改并一键生成对应实际使用的py界面文件. 首先是一些基本的概念,QD ...
- QT学习——Qt工具介绍,Qt助手使用,第一个Qt程序,Qt字符串和字符编码
一.Qt主要工具介绍 1)qt助手(assistant) 2)qt构建器(qmake) 3)qt设计师(designer) 4)qt转换器(uic) 5)qt资源编译器(rcc) 6)qt元对象编译器 ...
- Qt 工具类(05):在Qt里使用Lamda表达式
文章目录 一.前言 二.什么是Lamda表达式? 2.1. Lambda 表达式的语法 2.2.Lambda函数的捕获列表 三.在Qt中使用Lambda表达式函数 3.1.信号连接Lambda 3.2 ...
- 【转】09.认识一下Qt用到的开发工具
Qt 不是凭空产生的,它是基于现有工具链打造而成的,它所使用的编译器.链接器.调试器等都不是自己的,Qt 官方只是开发了上层工具.下面我们分几个部分讲解 Qt 使用到的工具链. GNU 工具集 在上个 ...
- QT使用多国语言及linguist工具使用
在QT代码中使用不同语言.qm文件就能让程序转换成相应的语言.但必须有相应语言的字库支持才能转换成功,否则会出现乱码或空格.字体库有各种格式,需要放在/usr/lib/fonts目录下才行,下图圈出来 ...
- SM2 (含SM3、SM4)国密算法工具QT版,彻底搞懂sm2算法的使用
网上有很多网友问算法SM2怎么使用?什么是压缩公钥和非压缩公钥?xB和yB这参数是什么?怎么使用SM2做加解密?如何签名和验签?有没有工具来验证下? 这里分享个自己用QT造的一个小工具,简单好用,同时 ...
- python界面设计资源库_python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法...
PyQt5 Qt Designer (Qt设计师) PyQt5是对Qt所有类进行封装, Qt能开发的东西, PyQt都能开发. Qt是强大的GUI库之一, 用C++开发, 并且跨平台. PyQt双许可 ...
最新文章
- 在VMware Workstation上安装Ubuntu 16.04 Server操作系统
- java 反射代价_Java反射机制
- Java中文编码小结
- 太多脚本将会毁掉持续交付
- MYSQL ROOT权限丢失的解决方法
- 进入Ubuntu图形桌面的方法
- 块级元素与行级元素(内联元素)
- ubuntu16.04下面安装mongodb
- MyBatis动态SQL底层原理分析 与 JavaScript中的Date对象,以及UTC、GMT、时区的关系...
- android 应用自动重启,Android 应用崩溃后自动重启的方法
- shell脚本拼接中间带空格的两个变量成一个变量
- Redis进阶-高可用:集群
- rtp发送h264和h265
- Python 爬虫“学前班”!学会免踩坑!
- SecureCRT恢复默认字体
- 凸优化第六章逼近与拟合 6.1 范数逼近
- Centos系统设置
- 打印系统开发(5)——书脊
- html5实现对试题图片批改效果,类似盖章效果
- 数学模型——数学与人类文明的桥梁
热门文章
- 魔方的终结还原步数是20步
- 2020新榜大会:科技赋能,内容如何破界?
- 安卓开发——为自己的app快速集成聊天功能
- to be delete
- mercurymw305r虚拟服务器,水星MW305R(V1-V3)路由器桥接设置教程
- 怎么把电子版照片换底色?照片换底色最简单的方法
- 2022年考研「怪」象:国家分数线全面上升,部分院校的计算机类复试线却不增反降?...
- 怎样做出漂亮的excel数据分析表格
- Maven ‘parent.relativePath‘错误
- 单端怎么转差分信号_单端转差分信号电路详解