关键字参数理解:

在QT中,连接槽与信号的关键字是connect,它里面的参数如下:

按照我的理解,里面四个参数分别如下:

1、信号发送者

2、发送的信号

3、信号接收者

4、接收的信号

【拓】:

信号发送者和信号接收者传的参数都是相应对象的地址

如果声明对象的时候,使用的是指针,则不用加&,如果是直接声明的对象,则需要加&进行取址。

例如:

声明一个按钮对象

QPushButton button1;//直接声明的对象本身

调用相应函数时,使用“.”关键字

在connect中使用如下:

connect(&button1,参数2,参数3,参数4);

QpushButton *button2;//声明了一个指向该button对象的指针,指针表示的就是该对象的地址,加*表示该对象的内容

调用相应函数时,使用“->”关键字

在connect中使用如下:

connect(button2,参数2,参数3,参数4);

比如说,点击一个按钮a,点击之后,使另一个按钮b消失

那么按钮a就是信号发送者,点击按钮这个动作就是发送的信号;

按钮b就是信号的接收者,按钮b消失就是接收到的信号

内置的信号与槽函数:

根据前面讲的,点击一个按钮a,让按钮b消失,如果写的话,可以这样写:

QPushButton *a;

QPushBUtton *b;

a=new QPushButton("a",this);//使用指针需要使用new关键字申请控件

b=new QPushButton("b",this);

connect(a,&QPushButton::clicked,b,&QPushButton::hide);

如果我们查看QPushButton的API,会发现如下内容:

会发现QPushButton里已经有内置的槽函数了

其槽函数好像只有一个,showMenu(),但是仔细看,会发现,API里写着,有5个槽函数继承自QAbstractButton,有19个槽函数继承自QWidget,有1个槽函数继承自QObject。

但是又仔细看QPushButton的API,发现,它并没有内置的信号呀,但是再仔细看,会发现,QPushButton它继承自QAbstractButton,而查看QAbstractButton的API可以发现如下内容:

在这里我们发现了Signals,查看得:

如果再细心点,可以看到,QAbstractButton继承自QWidget,而QWidget也有信号

自定义槽函数:

这里依旧是举个例子,我们现在有个按钮QPushButton *a,它的父窗口是一个QWidget,

代码主要内容是这样的:

现在有三个文件:

mainWidget.h、mainWidget.cpp、main.cpp

mainWidget.h添加的内容如下,在这里我只是声明了一个按钮

private:

QPushButton *button;

添加头文件

#include<QPushButton>

再加上我们自定义的槽函数:

mainWidget.cpp添加的内容如下:

resize(200,200);

setWindowTitle("Hello");

button=new QPushButton("button",this);

connect(button,&QPushButton::clicked,this,&mainWidget::mySLOT);

这里我定义了窗口的名称是Hello,当我按下button时,就会触发我们自定义的槽函数,我们自定义的槽函数内容就是改变窗口的名称:

这个时候,运行程序

当点击button后

窗口的名称发生了变化

自定义信号:

在前面的基础之上,我们来实现自定义信号

在自定义信号之前,我们需要知道:

信号必须要有signals关键字来声明,信号没有返回值,但可以有参数

信号实际上就是函数的声明,只需声明,无需定义,信号可以重载

使用emit关键字,发送信号。

我们再定义一个带有按钮的窗口subWidget,这时候在原先的代码基础上,又多了两个文件:

subWidget.h、subWidget.cpp

subWidget.h里面的内容如下:

这里定义了一个button按钮,然后定义了一个槽函数mySLOT(),在signals关键字下定义了一个函数mySignal();

subWidget.cpp里面的内容如下:

这里的意思是,当我们按下这里的button按钮时,就触发我们的槽函数,我们的槽函数里面的内容就是发送我们的信号

同时也在mainwidget.h文件里加入下面两句话:

在mainwidget.cpp文件里加入下面内容:

这里的意思就是说,当发出mySignal这个信号后,触发mySubSLOT这个槽函数,那么怎么才能发出mySignal这个信号呢,就需要点击上面我们说的button按钮,触发响应的槽函数,从而发出mySignal信号。

该程序的效果图如下:

点击button按钮后

出来这个界面

点击这个界面的button按钮后,将它的窗口名称改成subWidget

信号的重载:

前面我们已经知道了怎么写自定义的信号,也知道了信号可以重载,那我们这里就将我们刚才写的信号进行一次重载。

在subwidget.h文件中将mySignal()信号进行重载

【注】:信号参数只需声明,无需定义

在subwidget.cpp文件中,将重载的信号加入到槽函数中

传入了参数

点击按钮后,发出信号,但是这里我们并不知道我们接收到的是哪个信号,程序报错

【解决办法】:

通过函数指针来解决

这里,当点击按钮时,会触发响应的槽函数,槽函数里面是发出两个信号,一个是无参的mySingle()信号,一个是有参的mySingle(int,QString)信号

Qt4与Qt5信号与槽的区别:

我们看网上的教程,在信号与槽这个地方,我们可能会看到这样的单词:SIGNAL,SLOT

其实这里是QT4的用法,在QT5里面使用的是我们刚才的用法,这里简单介绍一下QT4里面的用法。

看我们使用SIGNAL关键字的时候,直接就可以选择不同的信号,这样就免去了QT5里面使用函数指针。

使用SLOT关键字,里面直接是槽函数,但是有一点要注意,在QT5里面,我们自定义的槽函数直接定义,但是在QT4里面,我们自定义的槽函数要有slots关键字修饰:

为什么QT5要对这个槽函数的写法进行修改呢,有两点原因,一方面,在QT4中,我们自定义的槽函数在定义时必须要用slots关键字修饰,在QT5中则不需要;另一方面,使用SIGNAL关键字,当我们手误把其中的信号单词写错时,在编译阶段并不会报错,只有在运行阶段才会报错,在大型的项目中,这样不太好,而使用QT5的写法,当手误写错时,编译阶段就已经报错了,能及时发现并定位到相应位置。

匿名函数:

有时候通过匿名函数实现对信号的操作会方便很多,其格式如下:

使用匿名函数之前,需要在项目文件中加上这样的一句话:

CONFIG+=C++11

匿名函数使用一个中括号[ ],一个小括号( ),一个花括号{ }组成,花括号里面放代码片段

这句话的效果是,每点击一次button按钮,就会输出1111.

如果我这个时候想要改变button的text值,只需在花括号里面写button->setText("Change")即可,但是在运行的时候发现报错了,报错理由是找不到button,没有声明button。

解决办法:

[ ]里面可以传入外面的参数进来,所以只需要在[ ]里面把button传进去就行了,这里的参数传递是值传递。

在[ ]里面写个“=”,就是把外部所有局部变量类中所有成员以值传递,但这种情况下,传递进去的值默认为只读形式,不能        修改,如果想要修改,就需要在()后面加一个关键字:mutable

在[ ]里面写this,类中所有成员以值传递方式。

在[ ]里面写“&”,引用符号,外部所有局部变量

这里查看clicked的API会发现,clicked函数是有参数的

那么这个参数我们要怎么使用呢?这里只需要将相应的参数传入到匿名函数的小括号内就可以了

每按一下,都会输出一个false。

对QT5信号与槽的认识相关推荐

  1. 【Qt教程】1.6 - Qt5信号与槽、Single Slot emit、自定义信号、自定义槽

    信号与槽 1. 说明 概念:信号和槽,是Qt对象间通信的接口.信号Signal.槽Slot,分别对应着事件的发送端和接受端. 语法: connect( 信号的发送者, 发送的具体信号, 信号的接收者, ...

  2. QT5开发之 信号与槽机制

    文章目录 什么是信号与槽? 信号与槽原理 如何实现信号与槽机制? 实现方式 UI方式 代码方式(QT4) QObject类:connect和disconnect 连接函数(QT4+QT5使用) 找到类 ...

  3. matlab有信号与槽机制么,笔记:Qt5中的信号与槽,不要再用SIGNAL,SLOT了

    看的书是Qt5.9,但书上却用的Qt4中的通用用法:SIGNAL和SLOT宏, 不过,书后面却又给了一种传递信号和槽函数地址的用法(Qt5的用法),但是这本书的作者在这块却说的不好,如下图: 首先要知 ...

  4. Qt工作笔记-Qt5新版信号与槽

    运行截图如下: 格式如下: [static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemb ...

  5. QT5开发及实例学习之二信号和槽机制

    文章目录 前言 一.信号与槽机制的连接方式 二.信号与槽机制的优点 三.信号与槽机制的效率 前言 Qt提供了信号和槽机制用于完成界面操作的响应,信号和槽机制是完成任意两个Qt对象之间的通信机制.其中, ...

  6. Qt5如何添加信号和槽

    对于刚入门来说,自己了解到信号和槽的创建方式有两种,这里暂且称他们为静态创建和动态创建. 何为静态创建和动态创建呢?这里我们以按钮pushButton为例.假设我们已经创建好了Dialog窗口, 然后 ...

  7. Qt5教程(三):自定义信号与槽

    1. 自定义槽 槽可以是任何成员函数.普通全局函数.静态函数 槽函数和信号的参数和返回值要一致 由于信号是没有返回值的, 槽函数也一定没有返回值 首先在mainwidget.h中添加槽函数: publ ...

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

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

  9. Qt Designer信号和槽

    2019独角兽企业重金招聘Python工程师标准>>> 先入一些信号槽的基本介绍: 信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性,也是 QT 区别于其它工具包 ...

最新文章

  1. HTML DOM 节点
  2. 【DIY】木质音乐盒,聆听一下治愈之音。How To Make Music box out of nothing at all
  3. 网易云信SDK V3.1.0版本发布啦
  4. NURBS曲线与曲面
  5. php中间件怎么使用,laravel框架中间件简单使用方法示例
  6. mysql 硬负载_软负载均衡和硬负载均衡
  7. php好玩的源码_PHP 经典有趣的算法
  8. linux硬件开发学习,硬件学习该从何下手
  9. linux yum坏了怎么办,yum坏掉的解决
  10. 安卓获取签名证书SHA1值
  11. Oracle执行计划变更
  12. Android 应用程序无响应(ANR)报错原因
  13. 高中计算机应用面试教资真题,2019下半年高中信息技术教师资格证面试试题(精选)第四批...
  14. 创建视图,修改视图,修改视图数据
  15. 新浪20年:独行侠的影响力之路
  16. 嵌入式睡眠监控报警仪的研究及设计
  17. RK987蓝牙机械键盘win和alt键互换
  18. python爬取豆瓣图书top250_「豆瓣读书250」爬取豆瓣TOP250书单 - seo实验室
  19. 华为服务器XH628配置软RAID
  20. 小程序源码:全新趣味测试-多玩法安装简单

热门文章

  1. 815 - Flooded!
  2. 2022电工(初级)操作证考试题及模拟考试
  3. matlab t tide,[转载]t_tide潮汐潮流调和分析工具包教程
  4. org.tigris.subversion.javahl.ClientException: Attempted to lock an already-locke
  5. oracle 系统资源正忙,oracle提示资源正忙怎么解决?oracle资源正忙解决方法
  6. 内外兼修:程序员的成长之路+软技能 代码之外的生存指南
  7. 反思专家型领导---转载--读后感
  8. Intellij IDEA什么是 moudle 什么是project ?与eclipse的差别
  9. Windows10官网原版系统下载地址汇总
  10. 判断是页面否为微信打开