从库本身来说,qt的信号与槽退出后倍受业界赞许,它是Qt重要的特性。信号和槽是Qt特有的信息传输机制,是Qt程序设计的重要基础,可以让互不干扰的对象建立一种联系。不仅GUI界面项目可以用控制台项目也可以使用。

Qt为了方便事件的处理,引入了信号(Signal) 的概念,封装了一些事件操作的标准预处理,使得用户不必去处理底层事件,只需要处理信号即可,同时qt将信号概念更加广泛化,可以发送自定义信号。

信号与槽(Slot) 其实都是函数。

“三步使用法”:emit函数发射信号,slot函数实现功能,connect函数绑定连接起来。

当事件被触发时将发送一个信号,与之连接的槽函数则可以接收到并做出响应。

“相当于将军发出吹哨信号,士兵听到开始拿枪冲锋”。

信号发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用
连接(connect) 函数,意思是将想要处理的信号和自己的一个函数(槽)绑定来进行处理。也就是说,当信号发出时,被连接的槽函数会自动被回调。

槽的本质是类的成员函数,它的参数可以是任意类型,和普通C++成员函数几乎没有
区别,唯一的区别是:槽可以与信号连接(可理解为绑定)在一起,每当和槽连接的信号被发出时,就会调用这个槽。

1、信号

信号使用注意:

1、必须包含头文件<QObject>和元对象宏 Q_OBJECT

2、signals 关键字指出进入了信号声明区,随后即可声明自己的信号函数。也可以带任何形式的参数。

3、使用时emit发射即可;

2、槽函数

slots关键字指出进入了槽函数声明区,随后即可声明自己的槽函数。

#ifndef TEST_H
#define TEST_H#include <QObject>
#include <QDebug>
class test : public QObject
{Q_OBJECT
public:explicit test(QObject *parent = nullptr);signals:void close();public slots:void dostuff();
};#endif // TEST_H
#include "test.h"test::test(QObject *parent) : QObject(parent)
{}void test::dostuff()
{qInfo() << "Doing stuff!";emit close();
}

3、connect函数

connect归属于QObject,五个形参,一般只用四个,第五个默认。

简单理解为:谁发送,发送的什么信号,谁接收,接受后槽函数怎么处理

QObject::connect(&tests,&test::close,&a,&QCoreApplication::quit);

以下案例,使用第五个形参——类型type

这里tests发送,发送的是关闭信号,a接受,调用a预定义的槽函数,类型QueuedConnection。

1、当默认的话AutoConnection会被视为DirectConnection,槽函数运行在发送者内也就test内,会导致Exit mark:无法或者说没机会打印输出;

2、当被指定为QueuedConnection,槽函数运行在接收者内,也就a内。所以Exit mark:正常输出。

#include <QCoreApplication>
#include "test.h"
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);test tests;QObject::connect(&tests,&test::close,&a,&QCoreApplication::quit,Qt::QueuedConnection);tests.dostuff();int mark=a.exec();qInfo() << "Exit mark:" << mark;return mark;//return a.exec();
}

最后:

Qt的事件和信号与槽是不同的!!!

1、信号由具体对象发出,然后会马上交给由connect()函数连接的槽进行处理。

2、事件,Qt使用一个事件队列对所有发出的事件进行维护;当新的事件产生时,会被追加到事件队列的尾部;前一个事件完成后,取出后面的事件接着进行处理。

过程:事件派发 notify-> 事件过滤eventFilter->事件分发event->事件处理

信号与槽的效率是非常高的,但是同真正的回调函数比较起来,由于增加了灵活性,因此在速度上还是有所损失,当然这种损失相对来说是比较小的,通过在一台 i586-133 的机器上测试是 10 微秒(运行 Linux),可见这种机制所提供的简洁性、灵活性还是值得的。

4-Qt6控制台项目信号与槽相关推荐

  1. QT 基础知识一(QT安装、创建项目、常用窗口控件使用、信号与槽机制讲解)

    QT概念 Qt:Qt是一个跨平台的C++框架(C++库),Qt除了支持界面设计(GUI编程),还封装了与网络编程.多线程.数据库连接.视频音频等相关的功能. ctrl 撤销(返回上一步) 市面常见的G ...

  2. Qt 控制台 使用connect连接信号和槽

    导言: Qt的信号号和槽 (Signal&Slots)是Qt的特性,深入理解该机制是能够精通Qt编程的关键. 信号号和槽 (Signal&Slots)的作用: 信号和槽用于两个对象之间 ...

  3. Python 小白从零开始 PyQt5 项目实战(3)信号与槽的连接

    本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战. 什么叫从零开始?从软件安装.环境配置开始.不跳过一个细节,不漏掉一行代码,不省略一个例图. ...

  4. dell服务器r730老自动重启_Re: DELL R730 服务器异常卡死导致iDRAC控制台无信号以及服务器远程连接失败重启后报内存错误(已插拔并已改变卡槽位置)...

    问题描述:原本是运行ESXI无任何问题,需要重新安装Ubuntu系统以及安装后会产生下列问题,重启后通过idrac查看内存又是正常的: 出现错误问题的两种情况,会导致服务器异常卡死导致iDRAC控制台 ...

  5. 服务器位置异常,DELL R730 服务器异常卡死导致iDRAC控制台无信号以及服务器远程连接失败重启后报内存错误(已插拔并已改变卡槽位置)...

    问题描述:原本是运行ESXI无任何问题,需要重新安装Ubuntu系统以及安装后会产生下列问题,重启后通过idrac查看内存又是正常的: 出现错误问题的两种情况,会导致服务器异常卡死导致iDRAC控制台 ...

  6. QT Core | 信号槽03 - 自定义信号与槽

    文章目录 一.前言 二.新建一个QT控制台项目 2.1.New File or Project 2.2.Project Location 2.3.Define Build System 2.4.Kit ...

  7. Python Qt GUI设计:多线程中信号与槽的使用(基础篇—9)

    有时候在项目开发时,经常会遇到一些耗时操作导致界面迟缓卡顿,为了解决这个问题,可以创建多线程,使用主线程更新界面使用子线程实时处理数据,最后将结果显示到界面上. PyQt多线程将使用QThread函数 ...

  8. Python Qt GUI设计:信号与槽的使用方法(基础篇—7)

    目录 1.信号与槽的概念 2.信号与槽的基础函数 2.1.创建信号函数 2.2.连接信号函数 2.3.断开信号函数 2.4.发射信号函数 3.信号和槽的使用方法 3.1.内置信号与槽的使用 3.2.自 ...

  9. QT信号与槽——观察者模式——回调函数

    QT信号与槽--观察者模式--回调函数 1.QT信号与槽机制 1.1信号本质 信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时候 Qt 对应的窗口类会发出某个信号.比如 ...

最新文章

  1. IDC:2018年中国制造业十大预测
  2. VC获取系统时间、程序运行时间
  3. 散列(哈希 hash)
  4. invalid signature 错误原因验签失败_Nginx 失败重试机制
  5. python基础类型,Python基础-类
  6. TS基础1(类型定义、接口)-学习笔记
  7. 图像处理直方图匹配-巴氏系数原理及实现
  8. XML文件处理的思考
  9. SAP 中 Webservice的发布和调用过程。
  10. 《别做“正常”的傻瓜(全新第2版)》
  11. 射频芯片设计EM仿真(二)--对比EM仿真和schmetic仿真
  12. java操作seaweedfs
  13. php mysql admin_mysql+phpAdmin
  14. iOS-发布按钮动画(类似于闲鱼发布),弹出动画github开源
  15. cad调了比例因子没反应_天正CAD标注比例大小调整方法
  16. webpack打包图片资源问题
  17. PPT、word破解加密文档
  18. 基于卡方的独立性检验
  19. APNS推送证书生成与验证
  20. 微信怎么收银行卡的消息服务器,你的银行卡短信通知收费吗

热门文章

  1. html overflow隐藏滚动条,css 之内容溢出滚动,隐藏滚动条
  2. python面试经典题_16道Python经典面试题及答案
  3. 数据库查询某一列大写转化小写字母表示_算法/开发 面试必看! 【数据库】面试题合集...
  4. sklearn 随机森林_初识随机森林及sklearn实现
  5. java队列_RPC远程调用和消息队列MQ的区别
  6. html一个div浮动在另一div上,css – 在另一个DIV的顶部浮动DIV
  7. cpuz北桥频率和内存频率_内存频率怎样计算,一分钟教会你
  8. python基础教程:统计计数的4种常用的方法
  9. 7 个习惯帮你提升Python运行性能
  10. java反射构造函数_【译】3. Java反射——构造函数