QT 信号和槽

目录

信号和槽

自定义信号和槽

自定义信号带参数重载问题

信号和槽的拓展

信号连接信号

信号的断开

一个信号可以连接多个槽函数


信号和槽

信号与槽(Signal & Slot)是Qt编程的基础,也是Qt 的一大创新。因为有了信号与槽的编程机制,在Qt中处理界面各个组件的交互操作时变得更加直观和简单。它可以让应用程序编程人员把这些互不了解的对象绑定在一起。

信号:信号(Signal)就是在特定情况下被发射的事件,例如PushButton最常见的信号就是鼠标单击时发射的 clicked()信号,一个ComboBox最常见的信号是选择的列表项变化时发射的CurrentlndexChanged()信号。GUI程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。

槽:就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是︰槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

信号与槽关联是用QObject:.connect()函数实现的,其基本格式是:QObject:connect(sender,SIGNAL(signal()). receiver, SLOT(slot()));

  • 参数1:信号的发送者
  • 参数2:发送的信号
  • 参数3:信号的接收者
  • 参数4:处理函数(槽函数)

现在我们点击英雄联盟整个按钮,我们是,没有任何反应的,我现在在要想点击该按钮实现关闭窗口的功能。那么就得给他们之间建立信号与槽的联系

首先我们查看按钮QPushButton可以接收哪些信号?

在QPushButton类中是找不到Signals 的,要在他的父类中查看。

可以看到他可以接收这4种信号。

QT 信号和槽_第1张图片

我们现在就先尝试使用第一个,单击信号。实现单击按钮关闭窗口

关闭谁呢,关闭窗口,哪个窗口呢?我们自己新建的myWidget窗口,那么我们有实现它的关闭吗?并没有,那么我们需要自己先实现一个吗?不需要,我们可以看

QT 信号和槽_第2张图片

myWidget类,其实是QDialog的子类,而QDialog 又是QWidget 的子类,所以我们去帮助文档看看QWidget,直接在Public Slots种找

QT 信号和槽_第3张图片

第一个就是close ()函数,应该就是关闭窗体的实现,也可以点进去看看。

现在我们实现信号槽的4个要素,就已经凑齐了,信号发送者是按钮我们new 的是btn,发送的信号是clicked单击信号,信号接收者是 this,就是本窗口嘛,槽函数是close,现在就好说了,可以让他们建立联系。

写入代码connect(btn,&QPushButton:clicked,this,&myWidget:close);

注意,在信号函数,和槽函数前需要加&号。

QT 信号和槽_第4张图片

编译,执行,点击“英雄联盟"按钮便可以关闭窗口。

总结:将本来没有连接的两个对象,连接在一起。本来点击按钮,跟关闭窗口没有联系,我们可以同connect让他们建立起联系。

自定义信号和槽

在这个的基础上,我们先设定一个需求:

屌丝男发向白富美表白,发送表白信号,白富美接收信号,并回应同意。

这里面有两个对象,一个屌丝男,一个白富美,我们将使用自定义的信号和槽将他们联系起来。

在项目下添加新类,boy类,girl类

QT 信号和槽_第5张图片

QT 信号和槽_第6张图片

基类选择Object,其余默认即可

QT 信号和槽_第7张图片

类名自定义Boy,选择QObject为基类是为了将此类加入 qt children 中,而QObject是最基本的基类。以同样的方式创建Girl类。

在Boy类的头文件中加入自定义信号

QT 信号和槽_第8张图片

在Girl类的头文件和源文件中添加自定义槽函数的定义和实现

QT 信号和槽_第9张图片

鼠标右击 lovetoo() 函数选择 refactor,选择添加在 girl.cpp 中

QT 信号和槽_第10张图片

在main.cpp 中new出对象并添加连接。connect连接信号与槽需要借助窗口,对话框

QT 信号和槽_第11张图片

运行程序,程序在表白函数中发送示爱信息,接收者收到信息并执行相应的槽函数。运行结果:打印出了槽函数中的信息。实现了自定义的信号和槽函数

QT 信号和槽_第12张图片

总结:自定义信号和槽的区别,信号和槽都为void类型,信号只需要定义,不需要实现,而槽函数既需要定义,也需要实现,信号和槽都可以有参数也都可以重载。

自定义信号带参数重载问题

首先看需求,高富帅表白成功后,他们就很有默契了。他们就要约会对不会,男的想说我们去看电影吧,女孩就很听男的话,收到信号后,就同意男孩,我们就去看电影,就是男孩说什么,女孩就同意男孩也说什么,这之间的话,就通过信号的参数来传递。

在boy.h 的signals下重载love函数,带一个QString 参数,就是这个传过去一句话,女孩也说这句话。记住,这个信号只需要定义,不需要实现,只要知道定义了这么一个带一个参数的信号就行了。触发这个信号,还需要一个QString的参数。

QT 信号和槽_第13张图片

在girl.cpp 也重载一个带参数的回应的槽函数

QT 信号和槽_第14张图片

QT 信号和槽_第15张图片

报错

QT 信号和槽_第16张图片

原因:编译器不知道调用的信号,槽函数指向是谁

可以使用带参数的函数指针来指向我们所要指向的那个函数

QT 信号和槽_第17张图片

信号和槽的拓展

信号连接信号

需求:点击表白的按钮,就可以同时实现关闭窗口,调用lovetoo()函数

因为点击按钮后,就会关闭窗口,QT帮我们回收资源,两个对象被直接被清理了,来不及调用函数,所以要把对象作为窗口的成员变量才能顺利调用函数

QT 信号和槽_第18张图片

QT 信号和槽_第19张图片

这一举动相当于点击按钮就会关联到信号以及关闭信号上,关闭信号又会关联到调用函数上。

信号的断开

学习了信号的连接,我们还可以将信号连接断开。

QT 信号和槽_第20张图片

可以通过disconnect函数来断开连接。使用方法和连接是一样的disconnect(信号发送者,信号,接收者,槽函数);

参数跟连接的是一样的。经过断开后,我们在运行,发现点击按钮后,就没任何作用了,因为连接已经被断开了。

 

一个信号可以连接多个槽函数

如在按下按钮的时候,不仅表白,还要关闭窗口。那么我们只需要将btn的单击信号再连接一个close的槽函数就可以了。

QT 信号和槽_第21张图片

可以看到我们的btn 的clicked信号,连接了两个槽函数,运行时,但这个信号触发的时候,不仅小哥哥表白成功,窗口也随即关闭了。

多个信号可以连接同一个槽函数

信号和槽函数的参数必须一一对应,信号的发送什么,槽就接收什么,类型必须一致。但信号的参数个数可以多余槽的参数的个数,但前面相同数量的参数类型必须——对应。反之则不可以。

你可能感兴趣的:(QT,QT)